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
toList
> -
Collections.sort
列表中包含一个基于V
排序的自定义Comparator
。> - 如果您只需要第3个
Map.Entry
,那么O(N)
选择算法就足够了。
- 如果您只需要第3个
//编辑后
看起来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在int
和Integer
之间的自动装箱/取消装箱function。 我注意到你在原始代码中使用了new Integer
和new Float
; 这是不必要的。
//另一个编辑
应该注意的是,如果您有多个具有相同价格的InflatedRunner
,则只保留一个。 如果这是一个问题,并且您希望保留所有跑步者,那么您可以执行以下操作之一:
- 如果你真的需要一个多地图(一个键可以映射到多个值),那么你可以:
- 有
TreeMap
> - 使用Google Collections中的
MultiMap
- 有
- 如果您不需要地图function,那么只需要一个
List
(抱歉,我不熟悉该域名,以便恰当地命名),其中RunnerPricePair implements
Comparable
价格的Comparable
。 您可以将所有对添加到列表中,然后:-
Collections.sort
列表并获得第3对 - 使用O(N)选择算法
-
你确定你正在使用哈希映射吗? 它们习惯于快速查找给定键的值; 对值进行排序然后尝试查找相应的键是非常不寻常的。 如果有的话,你应该将float映射到int,这样你至少可以对浮点键进行排序,并获得第三个最小的整数值
你必须分步完成:
- 从Map获取
Collection
的值 - 对值进行排序
- 选择第n个最小的索引
想想你想如何处理关系。
你可以使用google集合 BiMap ,假设Floats是唯一的。
如果您经常需要获取第n项的密钥,请考虑:
- 使用TreeMap,它可以有效地按键排序
- 然后使用双映射(即一个TreeMap映射整数> float,另一个映射float>整数)
您必须权衡需要维护两个映射的错误和潜在风险,以及具有可有效保持密钥有序的结构的可扩展性优势。
您可能需要考虑映射到同一个浮点的两个键…
PS忘了提一下:如果这是一个偶然的function,你只需要找到大量项目的第n个最大项目,你可以考虑实施一个选择算法(实际上,你做了一个排序,但实际上并没有打扰排序列表的子部分,您意识到您不需要排序,因为它们的顺序对您正在寻找的项目的位置没有任何影响)。