我有一个包含 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/