Question

Google Collections Multiset est un ensemble d'éléments dont chacun possède un nombre (par exemple peuvent être présents plusieurs fois).

Je ne peux pas vous dire combien de fois je veux faire ce qui suit

  1. un histogramme (exactement Multiset)
  2. Obtenir les N éléments supérieur en nombre à partir de l'histogramme

Exemples: top 10 URL (par # fois mentionné), les 10 balises (par # fois appliqués), ...

Quelle est la manière canonique pour faire # 2 collections donné une Google Multiset?

est un blog à ce sujet, mais que le code est pas tout à fait ce que je veux. Tout d'abord, il retourne tout, pas seulement le haut N. En second lieu, il copie (est-il possible d'éviter une copie?). Troisièmement, je veux habituellement une sorte déterministe, à savoir si tie-break compte sont égaux. D'autres nits. Ce n'est pas statique, etc

Était-ce utile?

La solution

J'ai écrit des méthodes avec les fonctionnalités de base que vous demandez, sauf qu'ils effectuent des copies et manquent de logique de bris d'égalité déterministe. Ils sont actuellement internes à Google, mais nous pouvons les ouvrir source à un moment donné. Ce problème Goyave a les signatures de méthode.

Leur algorithme est similaire au poste de blog: le tri d'une liste des entrées. Il serait plus rapide, mais plus compliqué, d'utiliser une meilleure algorithme de sélection.

EDIT: depuis 11 goyave, ceci est mis en œuvre

Autres conseils

Pour donner une autre perspective pour les gens de commenter, je posterai une version légèrement modifiée de I référencé blog post:

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;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top