java - 识别包含 300k+ 字符串的列表中的重复元素

标签 java performance arraylist duplicates detection

我有一个包含 305899 个字符串的列表(这是一个网站的用户名)。在我删除所有重复项后,数字下降到 172123 个字符串。

我想找出特定字符串(用户名)在该 ArrayList 中重复了多少次。我写了一个简单的冒泡排序类型的逻辑,但它太慢了。

private static Map<String, Integer> findNumberOfPosts(List<String> userNameList) {
    Map<String, Integer> numberOfPosts = new HashMap<String, Integer>();
    int duplicate = 0;
    int size = userNameList.size();
    for (int i = 0; i < size - 1; i++) {
        duplicate = 0;
        for (int j = i + 1; j < size; j++) {
            if (userNameList.get(i).equals(userNameList.get(j))) {
                duplicate++;
                userNameList.remove(j);
                j--;
                size--;

            }
        }
        numberOfPosts.put(userNameList.get(i), duplicate);
    }

    return numberOfPosts;
}

然后我改成这样:

private static Map<String, Integer> findNumberOfPosts(List<String> userNameList) {
    Map<String, Integer> numberOfPosts = new HashMap<String, Integer>();

    Set<String> unique = new HashSet<String>(userNameList);

    for (String key : unique) {
        numberOfPosts.put(key, Collections.frequency(userNameList, key));
    }

    return numberOfPosts;
}

这也真的很慢。当我的意思是慢时,完成列表需要 30 多分钟。

有没有其他有效的方法来处理这个问题?只是减少查找和计算重复元素所需的时间?

最佳答案

您的findNumberOfPosts 方法是在正确的轨道上,但您的实现正在做大量不必要的工作。
试试这个:

private static Map<String, Integer> findNumberOfPosts(List<String> userNameList) {
    Map<String, Integer> numberOfPosts = new HashMap<String, Integer>();

    for (String userName : userNameList) {
        Integer count = numberOfPosts.get(userName);
        numberOfPosts.put(userName, count == null ? 1 : ++count);
    }
    return numberOfPosts;
}

这在大多数机器上应该会在几秒钟内执行。

关于java - 识别包含 300k+ 字符串的列表中的重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8799048/

相关文章:

java - 如何将通用 JAXBElement 作为输入

java - 存储 HashMap 值与引用值的效率

java - 使用此代码从数组列表中删除重复项但忽略大小写

java - 复制数组或强制 ArrayList 指定初始大小。什么更有效?

java - 未序列化的 Arraylist 始终为空

java - Java 中的文件与随机访问文件

java - 从Android 2.1瞄准Android 1.6平台

java - 用 CharSequences 替换 String 用法?

performance - CSS 类型位置和性能

r - 更快的 i, j 矩阵单元格填充