Ci sono due modi di andare su questo in realtà.
Se lo farai frequentemente, suggerirei di memorizzare la mappatura al contrario, dove la chiave è il numero di volte che un nome è apparso, e il valore è un elenco di nomi che è apparso molte volte . Vorrei anche usare una HashMap per eseguire le ricerche anche nell'altra direzione.
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);
}
}
Qualcosa di simile per l'eliminazione ...
E, infine, per la ricerca:
ArrayList <String> maxOccurrences() {
return sortedOccurrenceMap.pollLastEntry().getValue();
}
restituisce l'elenco dei nomi che hanno le occorrenze max.
Se lo si fa in questo modo, la ricerca può essere eseguita in O (log n) ma i requisiti di spazio aumentano (solo con un fattore costante).
Se lo spazio è un problema, o le prestazioni non sono un problema, è sufficiente scorrere l'univocoNames.keySet e tenere traccia del valore massimo.
fonte
2011-09-21 11:17:56
Utilizzando il tuo primo metodo, come potrei quindi, avendo il numero del cognome più comune, trovare i cognomi che si verificano più volte? Vedrò l'altro metodo, grazie. – steven
Il punto è che hai ** Entry ** che contiene ** entrambi ** il nome e conta con il conteggio più alto. –
Cosa succede se c'è più di una di queste voci? Salvali in un array? – steven