0

この正確なことに関するトピックがすでにあることは知っていますが、実際に私の質問に答えるものはありません。これを行う方法はありますか?文字列をキーとして使用し、TreeSet クラスのオブジェクトを値として使用する TreeMap がある場合、特定のキーに関連付けられているセットに int を追加する方法はありますか?

私がすべきことは、TreeMap および TreeSet クラスを使用して、テキスト ファイルからコンコーダンスを作成することです。私の計画は、テキスト ファイル内の単語として TreeMap キーを使用することです。値は、単語が表示される行番号のセットになります。したがって、テキスト ファイルをステップ実行し、単語を取得するたびに TreeMap をチェックして、そのキーを既に持っているかどうかを確認し、そうでない場合は追加して、現在の行番号から始まる行番号の新しい TreeSet を作成します。の上。すでに持っている場合は、行番号をセットに追加するだけです。だから、私がする必要があるのは、セットの .add() 関数にアクセスすることです

何かのようなもの

map.get(identifier).add(lineNumber);

それがうまくいかないことはわかっていますが、どうすればいいですか?つまり、私がやろうとしていることをより簡単に行う方法があれば、代わりに喜んでそれを行いますが、学習と経験などすべてを知っているためだけに、この方法で行う方法を知りたいと思います.

4

4 に答える 4

1

次のロジックを検討してください (入力単語が配列にあると仮定します)。

TreeMap<String, TreeSet<Integer>> index = new TreeMap<String, TreeSet<Integer>>();
for (int pos = 0; pos < input.length; pos++) {
    String word = input[pos];
    TreeSet<Integer> wordPositions = index.get(word);
    if (wordPositions == null) {
        wordPositions = new TreeSet<Integer>();
        index.put(word, wordPositions);
    }
    wordPositions.add(pos);
} 

これにより、必要なインデックスが得られます。これは、文字列から文字列が表示される一連の位置にマップされます。特定のニーズに応じて、外側/内側のデータ構造をそれぞれ HashMap/HashSet に変更できます。

于 2013-03-26T14:02:14.973 に答える
0

コンストラクトが機能しない唯一の理由は、の結果map.get(identifier)が null になる可能性があるためです。個人的には、@EyalSchneider が回答した遅延初期化ソリューションが気に入っています。ただし、事前にすべての識別子がわかっている場合は、別の方法があります。たとえば、Map既知のすべての英語の単語を事前にロードする場合です。次に、次のようなことができます。

for (String word : allEnglishWords) {
    map.put(word, new LinkedList<Integer>);
}

for (int pos = 0; pos < input.length; pos++) {
    String word = input[pos];
    map.get(word).add(pos);
}
于 2013-03-26T14:12:23.573 に答える
0

MapofStringとを使用しない理由はArrayList<int>次のとおりです。

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

そして、単語を取得するたびに、それが に既に存在するかどうかを確認し、Map存在する場合は行番号を に追加し、存在しない場合は、指定された単語と指定された行番号Listの新しいエントリを に作成します。Map

if (map.get(word ) != null) {
    map.get(word).add(line);
}
else{
    final List<Integer> list = new ArrayList<Integer>();
    list.add(line);
    map.put(word, list);
}
于 2013-03-26T14:00:40.320 に答える
0

私が正しく理解している場合は、キーが表示された行番号を格納するためのツリーセットを参照する各キーを含むツリーマップが必要です。それは間違いなく実行可能であり、実装は非常に簡単です。なぜあなたmap.get(identifier).add(lineNumber);が働いていないのか分かりません。これは私がそれを行う方法です:

TreeMap<String, TreeSet<Integer>>  map = new TreeMap<String, TreeSet<Integer>>();
        TreeSet<Integer> set = new TreeSet<Integer>();
        set.add(1234);
        map.put("hello", set);
        map.get("hello").add(123);

それはすべて正常に動作します。

于 2013-03-26T14:03:32.143 に答える