n-й элемент hashmap - PullRequest
       257

n-й элемент hashmap

4 голосов
/ 17 апреля 2010
HashMap selections = new HashMap<Integer, Float>();

Как я могу получить ключ Integer 3-го меньшего значения Float во всей HashMap?

Редактировать im, используя HashMap для этого

for (InflatedRunner runner : prices.getRunners()) {
       for (InflatedMarketPrices.InflatedPrice price : runner.getLayPrices()) {
           if (price.getDepth() == 1) {
             selections.put(new Integer(runner.getSelectionId()), new Float(price.getPrice()));
           }
         }                    

}

мне нужен бегун 3-й меньшей цены с глубиной 1

может быть, я должен реализовать это по-другому?

Ответы [ 5 ]

5 голосов
/ 17 апреля 2010

Майкл Мрозек задает вопрос своим вопросом, правильно ли вы используете 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 с одинаковой ценой, будет сохранен только один. Если это проблема, и вы хотите оставить всех бегунов, то вы можете сделать одно из следующих действий:

  • Если вам действительно нужна мульти-карта (один ключ может отображать несколько значений), то вы можете:
    • есть TreeMap<Float,Set<InflatedRunner>>
    • Использование MultiMap из Google Collections
  • Если вам не нужна функциональность карты, просто укажите List<RunnerPricePair> (извините, я не знаком с доменом, чтобы правильно назвать его), где RunnerPricePair implements Comparable<RunnerPricePair> это сравнивает по ценам. Вы можете просто добавить все пары в список, а затем либо:
    • Collections.sort список и получите 3-ю пару
    • Использовать алгоритм выбора O (N)
4 голосов
/ 17 апреля 2010

Вы уверены, что используете хэш-карты, верно? Они используются для быстрого поиска значения по ключу; очень необычно сортировать значения и затем пытаться найти соответствующий ключ. Во всяком случае, вы должны отображать число с плавающей точкой в ​​int, чтобы вы могли по крайней мере отсортировать ключи с плавающей точкой и получить целое значение третьего наименьшего значения

1 голос
/ 17 апреля 2010

Вы должны сделать это поэтапно:

  1. Получить Collection<V> значений с карты
  2. Сортировка значений
  3. Выберите индекс n-го наименьшего

Подумайте, как вы хотите справиться со связями.

0 голосов
/ 17 апреля 2010

Вы можете сделать это с коллекциями Google BiMap , предполагая, что Float уникальны.

0 голосов
/ 17 апреля 2010

Если вам регулярно нужно получить ключ от n-го предмета, рассмотрите:

  • с использованием TreeMap, которое эффективно хранит ключи в отсортированном порядке
  • затем с использованием двойной карты (т. Е. Одно целочисленное отображение TreeMap> float, другое сопоставление float> integer)

Вы должны взвесить несоответствие и потенциальный риск ошибок из-за необходимости поддерживать две карты с преимуществом масштабируемости, благодаря наличию структуры, которая эффективно держит ключи в порядке.

Возможно, вам придется подумать о том, как два ключа отображаются на один и тот же float ...

P.S. Забыл упомянуть: если это случайная функция, и вам просто нужно найти n-й по величине элемент из большого количества элементов, вы можете рассмотреть реализацию алгоритма selection (эффективно, вы делаете сортировку, но на самом деле не беспокойтесь о сортировке частей списка, которые, как вы понимаете, вам не нужно сортировать, поскольку их порядок не влияет на положение искомого элемента).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...