hashmap的第n项

时间:2010-04-17 02:35:52

标签: java algorithm hashmap

HashMap selections = new HashMap<Integer, Float>();

如何在所有HashMap中获取Float的第3个较小值的Integer键?

修改 即时通讯使用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 个答案:

答案 0 :(得分:5)

如果你正确使用HashMap,Michael Mrozek会用他的问题指出它:这是HashMap非常不典型的场景。也就是说,你可以这样做:

  • Set<Map.Entry<K,V>>获取HashMap<K,V>.entrySet()
  • addAllList<Map.Entry<K,V>>
  • Collections.sort包含基于Comparator<Map.Entry<K,V>>排序的自定义V的列表。

//编辑后

看起来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"

另请注意我如何在intInteger之间利用Java的自动装箱/取消装箱功能。我注意到您在原始代码中使用了new Integernew Float;这是不必要的。


//另一个编辑

应该注意的是,如果您有多个价格相同的InflatedRunner,则只保留一个TreeMap<Float,Set<InflatedRunner>>。如果这是一个问题,并且你想要保留所有参赛者,那么你可以做以下几件事之一:

  • 如果您确实需要多地图(一个键可以映射到多个值),那么您可以:
  • 如果您不需要地图功能,那么只需RunnerPricePair implements(抱歉,我不熟悉域名,以便恰当地命名),其中Collections.sort Comparable<RunnerPricePair>比较价格。您可以将所有对添加到列表中,然后执行以下任一操作:
    • {{1}}列表并获得第3对
    • 使用O(N)选择算法

答案 1 :(得分:4)

你确定你正在使用哈希映射吗?它们习惯于快速查找给定键的值;对值进行排序然后尝试查找相应的键是非常不寻常的。如果有的话,你应该将float映射到int,所以你至少可以对float键进行排序并获得第三个最小值的整数值

答案 2 :(得分:1)

你必须分步进行:

  1. 从地图获取Collection<V>
  2. 对值进行排序
  3. 选择第n个最小的索引
  4. 想想你想如何处理关系。

答案 3 :(得分:0)

如果经常需要获取第n项的密钥,请考虑:

  • 使用TreeMap,它可以有效地保持按顺序排列的键
  • 然后使用双映射(即一个TreeMap映射整数&gt;浮点数,另一个映射浮点数&gt;整数)

你必须权衡需要维护两张地图的缺陷和潜在风险,以及具有有效保持按键有序的结构的可扩展性优势。

您可能需要考虑映射到同一个浮点数的两个键...

P.S。忘了提一下:如果这是一个偶然的功能,你只需要找到大量项目的第n个最大项目,你可以考虑实现一个选择算法(实际上,你做了一个排序,但实际上并没有打扰列表中您认为不需要排序的子部分,因为它们的顺序对您正在寻找的项目的位置没有影响。

答案 4 :(得分:0)

您可以使用google collections BiMap执行此操作,假设浮点数是唯一的。