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

  1. Fare un istogramma (esattamente Multiset)
  2. 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

È stato utile?

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;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top