2011-11-14 22 views
2

プログラミングとJavaを初めて使用しました。私は自分自身のデータ型/コレクションクラスを作成しようとしていますが、どうやってそれをどうやって行くのかは分かりません。独自のデータ型を作成する

文字列を含むクラスと、文字列の配列リストが必要です。

は通常、私はこのようなデータ型を作るに行くか:

public class Collection { 

    private int id; 
    private String word; 
    private int howMany; 
    private char firstChar; 

    public Collection (int i, String w, int h, char f){ 
     id = i; 
     word = w; 
     howMany = h; 
     firstChar = f; 
    } 
//Getters and Setters 
} 

私はArrayListの場でこれを行うことができますどのようにわかりません。

私の目標は、.txtファイルから読み込んだ文字列フィールドに一意の単語のクラスを持ち、arraylistフィールドにその単語を含むすべての.txtファイル名を持つことです。

編集:トム・アンダーソンの対応を踏まえ、どのような私が最初に行うことを考えた:

public class Collection { 

    private int id; 
    private String word; 
    private int howMany; 
    private char firstChar; 
    private List<String> filenames; 

    public Collection (int i, String w, int h, char f, List<String> filenames){ 
     id = i; 
     word = w; 
     howMany = h; 
     firstChar = f; 
     this.filenames = filenames; 
    } 

} 

作成するときに、私は単純にArrayListのパラメータに文字列を追加することはできませんので、私はまだこれを使用するかどうかはわかりませんMy Collectionクラスの新しいインスタンスです。このような:あなたがする必要がどのような

ArrayList<Collection> collection = new ArrayList<Collection>(); 
Collection newTest= new Collection("test","test"); 
collection.add(newTest); 
+0

検索/インデックスを実装しようとするなら、luceneを活用することができます。あなたは、コレクションを拡張するか、それをカプセル化することによって独自のコレクションを作成することができます。 – aishwarya

+0

最後のスニペットで呼び出している 'Collection'コンストラクタは何ですか?前に2つの文字列を受け取るコンストラクタは表示されていません。 –

答えて

1

HashMapを使用して行うことができます。その一例はhereである。

あなたはそうのような何かを行うことができます:

Map<String, List<String>> myMap = new HashMap<String, List<String>(); 

はその後、ファイルをロードし、必要なものを行います。

1

独自のデータ型は必要ありません。これは、Mapクラスが何のためにあるのかである:私は上に行く前に

public void someMethod() { 
    Map<String, Collection<String>> filesByUniqueWord = new HashMap<String, Collection<String>>(); 

    // inserting new entries 
    String uniqueWord = "hi";  
    List<String> filesContainingWord; // assume you have this   
    filesByUniqueWord.put(uniqueWord, filesContainingWord); 

    // deleting entries 
    filesByUniqueWord.remove(uniqueWord); 

    // getting all the files that contain some word 
    List<String> retrieved = filesByUniqueWord.get("hi"); // retrieved == filesContainingWord 
} 
4

その名の大人気クラスがjava.utilパッケージ内にすでに存在するため、Collectionは、クラスの良い名前ではありません。私はあなたのクラスOccurrencesと呼ぶでしょう。

額面であなたの質問を取るために、それは次のようになります。

public class Occurrences { 

    private int id; 
    private String word; 
    private int howMany; 
    private char firstChar; 
    private List<String> filenames; 

    public Occurrences (int i, String w, int h, char f, List<String> filenames){ 
     id = i; 
     word = w; 
     howMany = h; 
     firstChar = f; 
     this.filenames = filenames; 
    } 

} 

はあなたが考えられていましたか?あなたはこれでどんな問題を抱えていますか?

言及する価値のあるものがいくつかあります。

最初に、ArrayListを尋ねましたが、ファイル名のリストにはいくつかの特徴があります。ファイル名は一度しか指定できません。ファイル名の順序は問題ありません。つまり、それは実際にSetであり、Listではありません。ここで使用する実装クラスはHashSetになります。

第2に、このファイル名のコレクションを生成する必要があります。おそらく、これはあなたが困惑している場所です。この情報をファイルから読んでいますか?もしそうなら、カンマで区切られた文字列のファイル名のリストがあるとしましょう。同様に:

String filenamesStr = "one.txt,two.txt,three.txt"; 

セットにそれらを回すの最も簡単な方法は、(!はい、本当に)、配列にそれらを分割し、リスト内の配列をラップし、セットを構築するために、リストを使用することです:

また、ファイルを処理するときに、ファイル名をビルドしている可能性があります。その場合には、おそらく何を行うべきことオカレンスクラスせているそれらを蓄積する:

public class Occurrences { 

    private int id; 
    private String word; 
    private int howMany; 
    private char firstChar; 
    private Set<String> filenames; 

    public Occurrences (int i, String w){ 
     id = i; 
     word = w; 
     firstChar = w.charAt(0); // bonus feature! 
     howMany = 0; 
     filenames = new HashSet<String>(); 
    } 

    public void addOccurrence(String filename) { 
     ++howMany; 
     filenames.add(filename); 
    } 

} 

次に、あなたのインデックスファイルとして、単にaddOccurrenceあなたが言葉を見るたびに呼び出します。

第3に、他の回答者が指摘しているように、Mapはあなたの全体の世界を整理するのに良い方法です。単語をキーとして使用し、実際に必要なものに応じて、値としてOccurencesまたは生のファイル名のコレクションを使用することができます。

+0

これはまさに私が考えていたものですが、私がそれがうまくいくとは思わなかった理由は、クラスの新しいインスタンスを作成して、どのように文字列をarraylistに追加すればよいかということです。これを行うだけでは機能しません。コレクションnewTest =新しいコレクション( "test"、 "test"); \t \t \tコレクション。add(newTest); – DomX23

+0

バットのコレクションにいくつかの値を追加したいとき、古いトリックがあります...コレクション newTest = new ArrayList (){{add( "test"); add( "test")}}; – jkschneider

+0

@jkschneider:ああ、古いDouble-Brace Initializerです。 'Arrays.asList'の存在を考えれば、それはむしろ無駄な使用に見えます。ただし、マップを初期化するためには非常に便利です。 –

1

まずCollectionはjava.utilライブラリの一部として存在するので、非常に混乱するコレクションのCollectionを呼び出さないでください。

第2に、コレクションの作成方法を学習しているので実際にコレクションを作成したいと思っています。そうでない場合は、他の答えの中に説明されているようにHashMapやその他のマップを使用してください。

実際にコレクションを自分で作成したいと思えば、標準のJavaインターフェイスの1つを実装することをお勧めします。 java.util.CollectionまたはIterableです。この2番目の方法が最も簡単です。

だから、あなたが必要なもの

 
class MyCollection extends Iterable { 

    private String yourString; 
    private String theArray; 
    public MyCollection(String yourString, String[] theArray) { 
     this.yourString = yourString; 
     this.theArray = theArray 
    } 

    public boolean hasNext() { 
     // See if there is a next element to return 
     ... 
    } 

    public String next() { 
     // return the next one 
    } 
} 

のようなもの
1

は、文字列のArrayListのです。さてあなたのコードを見て、ゲッタとセッタを使用することを前提にしています。だからあなたがセッターを使用しているとき、私はそのコンストラクタ内のvaribalesに値を代入するのがベストプラクティスではないと思います。あなたは自分のArrayListのため

public class Collection { 

private int id; 
private String word; 
private int howMany; 
private char firstChar; 
private ArrayList<String> txtFiles; 

public Collection (int i, String w, int h, char f){ 
    word=new String(); 
    txtFiles=new ArrayList<String>(); 
    } 
} 

今すぐあなたのコンストラクタ内で、あなたのオブジェクトをインスタンス化できることの代わりに、ファイル名

そして設定するための追加や削除するには、このような

Add(String file) 
Remove(String file) 

などのメソッドを使用することができます他の変数はgetterとsetterを使用します

もう一方のcあなたのクラスをどのように設計すべきかと思います。

関連する問題