Найти new n элементов в мультисете из коллекций Google?

StackOverflow https://stackoverflow.com/questions/3029151

  •  26-09-2019
  •  | 
  •  

Вопрос

А. Коллекции Google Многословный это набор элементов, каждый из которых имеет значение (т. Е. Может присутствовать несколько раз).

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

  1. Сделайте гистограмму (именно многолетний)
  2. Получите Top N элементы по счету с гистограммы

Примеры: топ-10 URL-адресов (по словам # времена), топ-10 тегов (по приложенным времена), ...

Какой канонический способ сделать # 2, учитывая коллекции Google MultiSet?

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

Это было полезно?

Решение

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

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

Редактировать: поскольку Guava 11, это реализован

Другие советы

Чтобы сделать другую перспективу для людей, чтобы прокомментировать, я опубликую слегка модифицированную версию в блоге, которую я ссылался:

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;
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top