2014-01-21 3 views
2

У меня естьПолучить заказанное подмножество из мультимножества наиболее часто повторяемого X

Multiset<String> keys 

Я хочу иметь MultiSet с 200 наиболее частыми клавишами. Я выяснил, как получить ImmutableMultiset, который упорядочен по частоте, но у меня проблемы с получением только его подмножества.

я получил сортировочный аспект от этого другого stackOverFlow question

ImmutableMultiset<String> orderedMultiset = Multisets.copyHighestCountFirst(keys); 

Для подмножества аспекта я попытался с помощью MinMaxPriorityQueue, чтобы я мог использовать MaximumSize (200).

MinMaxPriorityQueue<String> orderedSubset = MinMaxPriorityQueue.maximumSize(200).create(orderedMultiset); 

Но, похоже, он возвращает только случайный выбор из 200 ключей. И проверка верхнего значения из упорядоченногоMultiset даже не появляется в возвращенном MinMaxPriorityQueue. Я также боюсь, что даже если бы это привело их в порядок, у меня могло получиться только пара разных ключей, где сумма подсчетов составляла 200. И желательно, чтобы у меня было 200 разных ключей со счетом для каждого.

Я спросил кого-то, и они упомянули что-то о POJO и сравнительном, но я не последовал тому, что они предложили. Поскольку POJO не может реально реализовать Comparable по определению. Я не совсем уверен.

Я также играл с использованием заказа guava, но я не думаю, что это сработает, поскольку функция будет принимать строки и не знает о счетах из мультимножества.

MinMaxPriorityQueue<String> strings = MinMaxPriorityQueue.orderedBy(topKCount).maximumSize(200).create(multisets); 


    private final Ordering<String> topKCount = Ordering.natural() 
     .onResultOf(new Function<String, String>() { 
      @Override 
      public String apply(String keys) { 
       //todo 
      } 
     }); 

Кто-нибудь знает, что я делаю неправильно здесь или, по крайней мере, укажу в правильном направлении. Спасибо

ответ

6

Если вы просто хотите, чтобы получить 200 наиболее часто ключи, вы можете просто сделать Multisets.copyHighestCountFirst(multiset).elementSet().asList().subList(0, 200). Если вам нравится, вы можете использовать это, чтобы заполнить другие ImmutableMultiset этими элементами и их соответствующими подсчетами из исходного мультимножества.

+0

Это было именно то, что я, как искал спасибо. Я самостоятельно знал о методах elementSet() и subList, но на самом деле не собрал их, чтобы объединить их. –

+1

В Java 8 мне пришлось делать: Multisets.copyHighestCountFirst (termFrequenciesInAllLists) .elementSet(). Stream(). Collect (Collectors.toList()). SubList (0, 200); – seinecle

+0

Я не уверен, зачем вы делаете '.stream(). Collect (Collectors.toList())' вместо 'ImmutableList.copyOf (...)' или 'new ArrayList <> (...)' –

0

Ваше решение MinMaxPriorityQueue не работает, потому что Iterable вид Multiset содержит только элементы, а не их значения. Выбор кажется случайным, потому что элементы сортируются по самим элементам, а не по частоте.

Вы почти у его с Ordering решение - использовать только оригинальные Multiset сделать сравнение:

final Multiset<String> multiset = ...; 
Ordering<String> ordering = Ordering.from(new Comparator<String>() { 
    @Override public int compare(String s1, String s2) { 
    return Ints.compare(multiset.count(s2), multiset.count(s1)); 
    } 
}); 
0

попробовать Использование:

ImmutableSortedSet.Builder(Ordering.explicit(${List})) ......;

ImmuetablSortedSet заказывает по индексу объекта из списка

Смежные вопросы