我试图在Ubuntu 12.04上的/usr/share/dict/words
中找到两个具有相同哈希码的单词。
尝试保持Map<Integer, HashSet<String>>
。
读完单词后计算他的哈希码h
,并将该单词放入密钥为h
的集合中。
然后遍历所有键并打印尺寸为&gt;的集合。 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
如何解决这个问题?
答案 0 :(得分:1)
HashSet<String> fileWords = new HashSet<>();
您只需实例化一个单词并将所有单词添加到其中。
您必须添加以下逻辑:
现在你拥有它的方式,你将所有地图键下的相同设置。
答案 1 :(得分:0)
我不太了解您的代码的目的,但在duplicats
中,您将每个hashCode
映射到文件中String
的所有fileWords
集合中})。然后显示它。以下代码可以正常工作。
public static void main(String[] args) throws FileNotFoundException {
Map<Integer,HashSet<String>> duplicats= new HashMap<Integer, HashSet<String>>() ;
Scanner scan = new Scanner(new File("C:\\Downloads\\Software\\sourceforge.net\\souptonuts\\dictionary\\linuxwords.1\\linux.words"));
while( scan.hasNext() ) {
String word= scan.nextLine() ;
int hc= new Integer( word.hashCode() ) ;
HashSet<String> count= duplicats.get( hc ) ;
if( count == null ) {
count= new HashSet<String>() ;
duplicats.put(hc, count ) ;
}
count.add( word );
}
int nonCollisionHashCodes= 0 ;
int singleCollisionHashCodes= 0 ;
int doubleCollisionHashCodes= 0 ;
for(Entry<Integer, HashSet<String>> e : duplicats.entrySet() ) {
if( e.getValue().size() <= 1 ) {
nonCollisionHashCodes++;
} else if( e.getValue().size() <= 2 ) {
singleCollisionHashCodes++;
} else if( e.getValue().size() <= 3 ) {
doubleCollisionHashCodes++;
} else {
System.out.println(e.getKey() + " : " + e.getValue().size());
}
}
System.out.println("Number of non-collision hashCodes: "+ nonCollisionHashCodes );
System.out.println("Number of single-collision hashCodes: "+ singleCollisionHashCodes );
System.out.println("Number of double-collision hashCodes: "+ doubleCollisionHashCodes );
}
至少对于我的字典,输出是:
Number of non-collision hashCodes: 626167
Number of single-collision hashCodes: 885
Number of double-collision hashCodes: 6
请注意,除了双重冲突hashCodes之外,没有输出。
根据我的口味,这些数据非常好。尝试使用字典并发布结果。