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

46
6

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

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

Или мне было бы лучше, просто используя hashmap и отсортировать его по значению, как описано в, например, Java sort HashMap по значению

спросил(а) 2012-03-22T07:37:00+04:00 7 лет, 8 месяцев назад
2
Решение
87

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

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

ответил(а) 2012-03-22T07:53:00+04:00 7 лет, 8 месяцев назад
Еще 1 ответ
33

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

ответил(а) 2012-03-22T12:23:00+04:00 7 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема