java - 在大文件Java中查找重复的行

标签 java performance duplicates treemap

所以,我有一个包含 300 万行单词的大文件。我需要查看是否有任何重复项。

我将线放在 TreeMap 中以便对它们进行排序,将“线”放入键中并将“1”赋给它们的值。当有重复时,该行的值叠加。然后我将不得不看看是否有任何不是 1 的值。

这是我的代码:

    BufferedReader list = new BufferedReader( new FileReader( args[0] ) );
    String line;
    TreeMap<String,Integer> map  = new TreeMap<String,Integer>();

    while ( (line = list.readLine()) != null )
    {
        if (!map.containsKey(line)) 
        {
            map.put(line, 0);
        }
        map.put(line, map.get(line) + 1);   
    }

    if ( !map.containsKey(1)  )
    {
        System.out.print("NOT UNIQUE");
    }
    else
    {
        System.out.print("UNIQUE");
    }
    list.close();
}

问题:

  1. 使用 TreeMap 会加快这个过程吗?或者使用 HashMap 会有相同/更快的速度?

  2. 输出:

    线程“main”中的异常 java.lang.ClassCastException:java.lang.String 无法转换为 java.lang.Integer 在 java.lang.Integer.compareTo(Integer.java:52) 在 java.util.TreeMap.getEntry(TreeMap.java:346) 在 java.util.TreeMap.containsKey(TreeMap.java:227) 在 Lab10.main(Lab10.java:22)

这是 if ( !map.containsKey(1) ) ,但我不知道出了什么问题。

最佳答案

最有效的实现实际上取决于您的要求。

根据您所写:所以,我有一个包含 300 万行单词的大文件。我需要查看是否有任何重复项。,我假设您只是想检查是否有重复行。

在这种情况下,您无需计算有多少重复项,使用 HashSet 和旧的、良好的字符串哈希函数可能就足够了(甚至更好)。

例子如下:

boolean hasDuplicate = false;
Set<String> lines = new HashSet<String>();
while ( (line = list.readLine()) != null && !hasDuplicate )
    {
        if (lines.contains(line)) {
            hasDuplicate = true;
        }
        lines.add(line);
    }

    if (hasDuplicate){
        System.out.print("NOT UNIQUE");
    } else {
        System.out.print("UNIQUE");
    }
    list.close();
}

关于java - 在大文件Java中查找重复的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23175236/

相关文章:

java - android 5.0及以上版本不显示应用栏标题

mysql - 在多 (1-n) 关系表上搜索

python - 将索引列表转换为 2D numpy 数组的最快方法

sql - 如何从列表中删除所有重复的对?

java - 从矩阵中找到长度为 N 的组合,每个元素需要来自不同的行/列

java - 高可用性 Web 应用程序 - 如何升级?

java - 强制参数名称一致性

performance - polymer 1 : Prevent iron-pages/app-route from attaching all pages at load

mysql - 加快 MySQL 连接检查重复项

jsf-2 - 组件 ID 形式 :composite:j_id2 has already been found in the view