hashmap的第n项

HashMap selections = new HashMap(); 

如何在所有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

也许我应该以另一种方式实现这个?

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

  • HashMap.entrySet()获取Set>
  • addAll to List>
  • Collections.sort列表中包含一个基于V排序的自定义Comparator>
    • 如果您只需要第3个Map.Entry ,那么O(N) 选择算法就足够了。

//编辑后

看起来selection应该是SortedMap 。 你应该看看java.util.TreeMap

以下是如何使用TreeMap获取第3个最低密钥的示例:

 TreeMap map = new TreeMap(); 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在intInteger之间的自动装箱/取消装箱function。 我注意到你在原始代码中使用了new Integernew Float ; 这是不必要的。


//另一个编辑

应该注意的是,如果您有多个具有相同价格的InflatedRunner ,则只保留一个。 如果这是一个问题,并且您希望保留所有跑步者,那么您可以执行以下操作之一:

  • 如果你真的需要一个多地图(一个键可以映射到多个值),那么你可以:
    • TreeMap>
    • 使用Google Collections中的 MultiMap
  • 如果您不需要地图function,那么只需要一个List (抱歉,我不熟悉该域名,以便恰当地命名),其中RunnerPricePair implements Comparable价格的Comparable 。 您可以将所有对添加到列表中,然后:
    • Collections.sort列表并获得第3对
    • 使用O(N)选择算法

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

你必须分步完成:

  1. 从Map获取Collection的值
  2. 对值进行排序
  3. 选择第n个最小的索引

想想你想如何处理关系。

你可以使用google集合 BiMap ,假设Floats是唯一的。

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

  • 使用TreeMap,它可以有效地按键排序
  • 然后使用双映射(即一个TreeMap映射整数> float,另一个映射float>整数)

您必须权衡需要维护两个映射的错误和潜在风险,以及具有可有效保持密钥有序的结构的可扩展性优势。

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

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