Майкл Мрозек задает вопрос своим вопросом, правильно ли вы используете HashMap
: это очень нетипичный сценарий для HashMap
. Тем не менее, вы можете сделать что-то вроде этого:
- получить
Set<Map.Entry<K,V>>
от HashMap<K,V>.entrySet()
.
addAll
до List<Map.Entry<K,V>>
Collections.sort
список с пользовательским Comparator<Map.Entry<K,V>>
, сортирующим по V
.
- Если вам нужен только 3-й
Map.Entry<K,V>
, то алгоритма выбора O(N)
может быть достаточно.
// после редактирования
Похоже, selection
действительно должно быть SortedMap<Float, InflatedRunner>
. Вы должны посмотреть на java.util.TreeMap
.
Вот пример того, как TreeMap
может использоваться для получения 3-го нижнего ключа:
TreeMap<Integer,String> map = new TreeMap<Integer,String>();
map.put(33, "Three");
map.put(44, "Four");
map.put(11, "One");
map.put(22, "Two");
int thirdKey = map.higherKey(map.higherKey(map.firstKey()));
System.out.println(thirdKey); // prints "33"
Также обратите внимание на то, как я использую функцию автоматической блокировки / распаковки Java в диапазоне от int
до Integer
. Я заметил, что вы использовали new Integer
и new Float
в своем исходном коде; это не нужно.
// другое редактирование
Следует отметить, что если у вас есть несколько InflatedRunner
с одинаковой ценой, будет сохранен только один. Если это проблема, и вы хотите оставить всех бегунов, то вы можете сделать одно из следующих действий:
- Если вам действительно нужна мульти-карта (один ключ может отображать несколько значений), то вы можете:
- Если вам не нужна функциональность карты, просто укажите
List<RunnerPricePair>
(извините, я не знаком с доменом, чтобы правильно назвать его), где RunnerPricePair implements
Comparable<RunnerPricePair>
это сравнивает по ценам. Вы можете просто добавить все пары в список, а затем либо:
Collections.sort
список и получите 3-ю пару
- Использовать алгоритм выбора O (N)