Компаратор для TreeBag для сортировки по количеству вхождений
У меня есть источник строк (скажем, текстовый файл), и многие строки повторяются несколько раз. Мне нужно получить верхние X наиболее распространенных строк в порядке уменьшения количества вхождений.
Идея, которая пришла на ум сначала, заключалась в создании сортируемой сумки (что-то вроде org.apache.commons.collections.bag.TreeBag) и поставке компаратора, который сортирует записи в том порядке, в котором я нуждаюсь. Однако я не могу понять, какой тип объектов мне нужно сравнить. Это должна быть какая-то внутренняя карта, которая объединяет мой объект (String) и количество вхождений, сгенерированных внутри TreeBag. Это возможно?
Или мне было бы лучше, просто используя hashmap и отсортировать его по значению, как описано в, например, Java sort HashMap по значению
Почему бы вам не поместить строки на карту. Карта строки в количестве раз, когда они появляются в тексте. На шаге 2 перемещайте элементы на карте и продолжайте добавлять их к минимальной куче размера X. Всегда извлекайте сначала мин, если куча заполнена перед вставкой.
Принимает время nlogx.
В противном случае после шага 1 сортировать элементы по количеству вхождений и принимать первые х элементов. Здесь будет полезной карта деревьев :) (я бы добавил ссылку на javadocs, но я на планшете) Принимает время nlogn.
С TreeMultiset
Guava просто используйте Multisets.copyHighestCountFirst
.