0

/usr/share/dict/wordsUbuntu 12.04で同じハッシュ コードを持つ 2 つの単語を見つけようとしました。

キープしようとしていMap<Integer, HashSet<String>>ます。

単語を読み取った後、彼のハッシュ コードを計算し、そのh単語をキーが であるセットに入れますh

次に、すべてのキーを反復処理し、サイズが 1 より大きいセットを出力します。

しかし、実行後に非常に奇妙な出力が表示されました。

コード:

public static void main(String[] args) throws FileNotFoundException {
        HashSet<String> fileWords = new HashSet<>();
        Map<Integer, HashSet<String>> duplicats = new HashMap<>();
        Scanner scan = new Scanner(new File("/usr/share/dict/words"));

        while (scan.hasNext()) {
            String word = scan.nextLine();
            int h = word.hashCode();
            fileWords.add(word);
            duplicats.put(new Integer(h), fileWords);
        }

        Set<Integer> keySet = duplicats.keySet();
        for (Integer key : keySet) {
            HashSet<String> value = duplicats.get(key);
            if (value.size() > 1) {
                System.out.println(key + " : " + value.toString());
            }
        }
    }

出力:

21917608 : [repaying, Zubenelgenubi, treason, indignation, eyetooth, ....// a lot of words

とても奇妙に見えます。何が悪いのかわかりませんか?

アップデート:

私は解決策を見つけました:

public static void main(String[] args) throws FileNotFoundException {
    Map<Integer, HashSet<String>> duplicats = new HashMap<>();
    Scanner scan = new Scanner(new File("/usr/share/dict/words"));

    while (scan.hasNext()) {
        String word = scan.nextLine();
        int h = word.hashCode();

        if (!duplicats.containsKey(h)) 
        {
            HashSet<String> newSet = new HashSet<>();
            newSet.add(word);
            duplicats.put(new Integer(h), newSet);
        } 
        else 
        {
            duplicats.get(h).add(word);
        }
    } /// rest the same

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

1
HashSet<String> fileWords = new HashSet<>();

1 つのセットだけをインスタンス化し、すべての単語をそのセットに追加します。

次のようなロジックを追加する必要があります。

  1. 現在のハッシュコード キーの下に既にセットがあるかどうかを確認します。
  2. ある場合は、単語を追加するだけです。
  3. そうでない場合は、新しいセットを作成し、単語を追加してマップに配置します。

現在の方法では、すべてのマップ キーの下に同じセットを配置しています。

于 2013-08-25T11:27:22.763 に答える