Pregunta

Google Colecciones Multiset es un conjunto de elementos, cada uno de los cuales tiene un recuento (es decir, pueden estar presentes múltiples veces).

No puedo decirle cuántas veces me quiero hacer la siguiente

  1. Hacer un histograma (exactamente Multiset)
  2. Obtener los elementos de la parte superior de la cuenta N a partir del histograma

Ejemplos: top 10 URL (por # de veces mencionado), la parte superior 10 etiquetas (# veces por aplicar), ...

¿Cuál es la forma canónica de hacer # 2 dado un Google Colecciones Multiset?

Aquí es un post al respecto, pero que el código no es exactamente lo que quiero. En primer lugar, se devuelve todo, no sólo arriba N. En segundo lugar, se copia (es posible evitar una copia?). En tercer lugar, por lo general quieren un tipo determinista, es decir, si los recuentos de desempate son iguales. Otros liendres:. No es estática, etc.

¿Fue útil?

Solución

Me escribió métodos con la funcionalidad básica que está pidiendo, excepto que realizan copias y carecen de lógica determinista de desempate. Son actualmente interna para Google, pero podemos abrir el código de ellos en algún momento. Este Guayaba tema tiene las firmas de métodos.

Su algoritmo es similar a la entrada del blog: ordenar una lista de entradas. Sería más rápido, pero más complicado, para usar una mejor algoritmo de selección .

EDIT: desde Guava 11, esto es implementado

Otros consejos

Para dar otro punto de vista para que la gente comenta en, voy a publicar una versión ligeramente modificada del blog post que hace referencia:

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;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top