我有一個包含305899個字符串(這是網站的用戶名)的列表。刪除所有重複項後,數字將降至172123字符串。在包含300k +字符串的列表中識別重複的元素
我想找到一個特定的字符串(用戶名)在該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分鐘以上。
有沒有其他有效的方法來處理這個問題?只需減少查找和計算重複元素所需的時間?
可以兩個有相同的用戶名,爲什麼重複? – Noor 2012-01-10 05:46:49
「我寫了一個簡單的氣泡排序類型邏輯,但速度太慢了。」 - 是的,這就是泡泡分類的問題:它是一個困難的O(N^2)每次都會給你。 – 2012-01-10 05:48:27
我建議你將它保存在數據庫表中,然後在用戶名上得到COUNT,這會更快更簡單。 – 2012-01-10 05:54:19