305899文字列(Webサイトのユーザー名)を含むリストがあります。すべての重複を削除すると、その数は172123文字列になります。300k +文字列を含むリスト内の重複要素を特定する
特定のString(ユーザー名)が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分以上かかることになります。
この問題を効率的に処理する方法はありますか?重複した要素を見つけてカウントするのにかかる時間を短縮するだけですか?
2人は同じユーザー名を持つことができますか?なぜ重複しますか? – Noor
「シンプルなバブルソートタイプのロジックを書いたが、遅すぎる」 - ええ、それはバブルソートの問題です:それは紋章的なO(N^2)が毎回あなたを得るでしょう。 –
これをデータベーステーブルに保存し、ユーザ名のCOUNTをもっと早く簡単に取得することをお勧めします。 –