在大文件中找到具有相同哈希码的两个单词 - 奇怪的输出

时间:2013-08-25 11:18:33

标签: java output hashcode

我试图在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

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

您只需实例化一个单词并将所有单词添加到其中。

您必须添加以下逻辑:

  1. 检查当前哈希码密钥下是否已有一个集合;
  2. 如果有,只需添加单词;
  3. 如果没有,请创建一个新集,添加该单词,然后将其放入地图中。
  4. 现在你拥有它的方式,你将所有地图键下的相同设置。

答案 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之外,没有输出。

根据我的口味,这些数据非常好。尝试使用字典并发布结果。