/usr/share/dict/words
Ubuntu 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
この問題を解決するにはどうすればよいですか?