Trova i migliori N elementi in un Multiset da Google collezioni?
Domanda
Google Collezioni Multiset è un insieme di elementi ciascuno dei quali ha un titolo (cioè possono essere presenti più volte).
Non posso dirvi quante volte ho voglia di fare quanto segue
- Fare un istogramma (esattamente Multiset)
- I elementi superiore N di conteggio dall'istogramma
Esempi: 10 URL (da # volte citato), top 10 tag (da # volte applicati), ...
Qual è il modo tradizionale per fare # 2 dato un Google Collezioni Multiset?
Ecco è un post su di esso, ma che il codice non è proprio quello che voglio. In primo luogo, restituisce tutto, non solo l'alto N. In secondo luogo, esso copia (è possibile evitare una copia?). In terzo luogo, di solito vuole una sorta deterministico, cioè tiebreak se i conteggi sono uguali. Altre lendini:. Non è statica, etc
Soluzione
ho scritto metodi con le funzionalità di base che stai chiedendo, salvo che essi svolgono le copie e la mancanza di logica deterministica tie-breaking. Sono attualmente interno a Google, ma ci possono open-source loro a un certo punto. Questo Guava problema ha le firme del metodo.
Il loro algoritmo è simile al post del blog: l'ordinamento di un elenco di voci. Sarebbe più veloce, ma più complicato, per usare una migliore algoritmo di selezione .
EDIT: dal 11 Guava, questo è implementato
Altri suggerimenti
Per dare un altro punto di vista per le persone di commentare, vi posterò una versione leggermente modificata del blog post ho fatto riferimento:
package com.blueshiftlab.twitterstream.summarytools;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multiset;
import com.google.common.collect.Ordering;
import com.google.common.collect.Multiset.Entry;
public class Multisets {
// Don't construct one
private Multisets() {
}
public static <T> ImmutableList<Entry<T>> sortedByCount(Multiset<T> multiset) {
Ordering<Multiset.Entry<T>> countComp = new Ordering<Multiset.Entry<T>>() {
public int compare(Multiset.Entry<T> e1, Multiset.Entry<T> e2) {
return e2.getCount() - e1.getCount();
}
};
return countComp.immutableSortedCopy(multiset.entrySet());
}
public static <T> ImmutableList<Entry<T>> topByCount(Multiset<T> multiset,
int max) {
ImmutableList<Entry<T>> sortedByCount = sortedByCount(multiset);
if (sortedByCount.size() > max) {
sortedByCount = sortedByCount.subList(0, max);
}
return sortedByCount;
}
}