У меня есть список, содержащий 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 минут, чтобы просмотреть список.
Есть ли другой эффективный способ решения этой проблемы? Просто сократить время, необходимое для поиска и подсчета дубликатов элементов?