Компаратор для TreeBag для сортировки по количеству вхождений

У меня есть источник строк (скажем, текстовый файл), и многие строки повторяются несколько раз. Мне нужно получить X самых распространенных строк в порядке убывания количества вхождений.

Сначала мне пришла в голову идея создать сортируемый мешок (что-то вроде org.apache.commons.collections.bag.TreeBag) и предоставить компаратор, который будет сортировать записи в нужном мне порядке. Однако я не могу понять, какой тип объектов мне нужно сравнить. Это должна быть какая-то внутренняя карта, которая объединяет мой объект (String) и количество вхождений, сгенерированных внутри TreeBag. Это возможно?

Или мне было бы лучше просто использовать хэш-карту и отсортировать ее по значению, как описано, например, в Java сортирует HashMap по значению


person AlexR    schedule 22.03.2012    source источник


Ответы (2)


Почему бы вам не поместить строки в карту. Сопоставление строки количеству раз, которое они появляются в тексте. На шаге 2 пройдитесь по элементам карты и продолжайте добавлять их в минимальную кучу размера X. Всегда извлекайте min сначала, если куча заполнена перед вставкой.
Занимает nlogx времени.

В противном случае после шага 1 отсортируйте элементы по количеству вхождений и возьмите первые x элементов. Здесь бы пригодилась древовидная карта :) (я бы добавил ссылку на javadocs, но я на планшете). Занимает nlogn времени.

person Adrian    schedule 22.03.2012
comment
Спасибо Адриан. В итоге я реализовал его как сортируемую хэш-карту, но куча — хорошая идея — в следующий раз я рассмотрю что-то вроде PriorityQueue с настраиваемым компаратором. - person AlexR; 24.03.2012

С помощью Guava TreeMultiset, просто используйте Multisets.copyHighestCountFirst.

person Louis Wasserman    schedule 22.03.2012