На самом деле есть два способа сделать это.
Если вы собираетесь делать это часто, я бы фактически предложил хранить отображение в обратном порядке, где ключ - это число раз, которое имя имеетпоявился, а значение представляет собой список имен, которые появлялись много раз.Я бы также использовал HashMap для поиска в другом направлении.
TreeMap <Integer, ArrayList <String>> sortedOccurrenceMap =
new TreeMap <Integer, ArrayList <String>> ();
HashMap <String, Integer> lastNames = new HashMap <String, Integer> ();
boolean insertIntoMap(String key) {
if (lastNames.containsKey(key)) {
int count = lastNames.get(key);
lastNames.put(key, count + 1);
//definitely in the other map
ArrayList <String> names = sortedOccurrenceMap.get(count);
names.remove(key);
if(!sortedOccurrenceMap.contains(count+1))
sortedOccurrenceMap.put(count+1, new ArrayList<String>());
sortedOccurrenceMap.get(count+1).add(key);
}
else {
lastNames.put(key, 1);
if(!sortedOccurrenceMap.contains(1))
sortedOccurrenceMap.put(1, new ArrayList<String>());
sortedOccurrenceMap.get(1).add(key);
}
}
Что-то похожее для удаления ...
И, наконец, для поиска:
ArrayList <String> maxOccurrences() {
return sortedOccurrenceMap.pollLastEntry().getValue();
}
Возвращает список имен с максимальным количеством вхождений.
Если вы сделаете это таким образом, поиск можно будет выполнить за O (log n), но требования к пространству возрастают (только на постоянную величину).хотя фактор).
Если пространство является проблемой, или производительность не является проблемой, просто переберите uniqueNames.keySet и отследите максимум.