2014-10-28 2 views
1

Согласно this question я заказал Java Map, следующим образом:Получить N наиболее значимые объекты в Java TreeMap

ValueComparator bvc = new ValueComparator(originalMap); 
Map<String,Integer> sortedMap = new TreeMap<String,Integer>(bvc); 
sortedMap.putAll(originalMap); 

Теперь я хотел бы, чтобы извлечь K наиболее соответствующие значения из карты, в Топ- K мода. Есть ли эффективный способ сделать это без повторения через карту?

P.S., некоторые подобные вопросы (например, this) запрашивают решение проблемы поиска первого порядка.

+1

Я бы сильно отговорил вас от использования этой реализации. Вы читали комментарии по верхнему ответу? http://stackoverflow.com/questions/109383/how-to-sort-a-mapkey-value-on-the-values-in-java#comment4699669_1283722 –

+0

Упс, не заметил. – Eleanore

ответ

4

Нет, если вы используете Map. Тебе придется перебирать его.

Считаете ли вы использование PriorityQueue? Это реализация Java кучи. Он имеет эффективные операции для вставки произвольных элементов и для удаления «минимума». Вы можете подумать об этом. Вместо Map вы можете поместить их в PriorityQueue по релевантности, с наиболее релевантным как корень. Затем, чтобы извлечь K наиболее актуальным, вы просто поместите K элементов из PriorityQueue.

Если вам нужно свойство карты типа (отображение от String до Integer), то вы могли бы написать класс, который внутри держит все в обоих PriorityQueue и HashMap. Когда вы вставляете, вы вставляете в оба; когда вы удаляете минимальный элемент, вы выпадаете из PriorityQueue, а затем указывается, какой элемент вам нужно удалить из вашего HashMap. Это все равно даст вам временные вставки и мини-абзацы.

+0

К сожалению, мне нужно сохранить два значения (String и Integer) на карте. Мне нужны они оба. Я подумал о том, чтобы ввести в очередь запись , но в этом случае операция queue.contains (<любой кортеж с указанным строковым ключом>) трудно реализовать – Eleanore

+0

@Eleanore Я добавил что-то к вопрос об этом. –

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