Найти лучшие N элементов в мультисете из Google Collections? - PullRequest
13 голосов
/ 12 июня 2010

A Google Collections Multiset - это набор элементов, каждый из которых имеет количество (то есть может присутствовать несколько раз).

Я не могу сказать вам, сколько раз я хочу сделать следующее

  1. Составьте гистограмму (точно Multiset)
  2. Получить верхние N элементов по количеству из гистограммы

Примеры: 10 самых популярных URL-адресов (в # раз упомянуто), 10 лучших тегов (в # раз применено), ...

Какой канонический способ сделать № 2 для мультисета Google Collections?

Здесь - это сообщение в блоге об этом, но этот код не совсем то, что я хочу. Во-первых, он возвращает все, не только верхнюю букву N. Во-вторых, он копирует (можно ли избежать копирования?). В-третьих, я обычно хочу детерминистическую сортировку, то есть разрыв связей, если количество равно. Другие гниды: это не статично и т. Д.

Ответы [ 2 ]

4 голосов
/ 17 июня 2010

Я написал методы с базовой функциональностью, которую вы запрашиваете, за исключением того, что они выполняют копии и не имеют детерминированной логики разрыва связей.В настоящее время они являются внутренними для Google, но мы можем открыть их в какой-то момент.Этот выпуск Guava имеет сигнатуры методов.

Их алгоритм аналогичен записи в блоге: сортировка списка записей.Было бы быстрее, но сложнее, использовать лучший алгоритм выбора .

РЕДАКТИРОВАТЬ: начиная с Guava 11, это реализовано

3 голосов
/ 12 июня 2010

Чтобы дать другим людям возможность комментировать, я опубликую слегка измененную версию сообщения в блоге, на которое я ссылаюсь:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...