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
也许我应该以另一种方式实现这一点?
答案 0 :(得分:5)
HashMap
,Michael Mrozek会用他的问题指出它:这是HashMap
非常不典型的场景。也就是说,你可以这样做:
Set<Map.Entry<K,V>>
获取HashMap<K,V>.entrySet()
。addAll
至List<Map.Entry<K,V>>
Collections.sort
包含基于Comparator<Map.Entry<K,V>>
排序的自定义V
的列表。
Map.Entry<K,V>
,那么O(N)
selection algorithm就足够了。//编辑后
看起来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"
另请注意我如何在int
和Integer
之间利用Java的自动装箱/取消装箱功能。我注意到您在原始代码中使用了new Integer
和new Float
;这是不必要的。
//另一个编辑
应该注意的是,如果您有多个价格相同的InflatedRunner
,则只保留一个TreeMap<Float,Set<InflatedRunner>>
。如果这是一个问题,并且你想要保留所有参赛者,那么你可以做以下几件事之一:
MultiMap
List<RunnerPricePair>
RunnerPricePair implements
(抱歉,我不熟悉域名,以便恰当地命名),其中Collections.sort
Comparable<RunnerPricePair>
比较价格。您可以将所有对添加到列表中,然后执行以下任一操作:
答案 1 :(得分:4)
你确定你正在使用哈希映射吗?它们习惯于快速查找给定键的值;对值进行排序然后尝试查找相应的键是非常不寻常的。如果有的话,你应该将float映射到int,所以你至少可以对float键进行排序并获得第三个最小值的整数值
答案 2 :(得分:1)
你必须分步进行:
Collection<V>
值想想你想如何处理关系。
答案 3 :(得分:0)
如果经常需要获取第n项的密钥,请考虑:
你必须权衡需要维护两张地图的缺陷和潜在风险,以及具有有效保持按键有序的结构的可扩展性优势。
您可能需要考虑映射到同一个浮点数的两个键...
P.S。忘了提一下:如果这是一个偶然的功能,你只需要找到大量项目的第n个最大项目,你可以考虑实现一个选择算法(实际上,你做了一个排序,但实际上并没有打扰列表中您认为不需要排序的子部分,因为它们的顺序对您正在寻找的项目的位置没有影响。
答案 4 :(得分:0)
您可以使用google collections BiMap执行此操作,假设浮点数是唯一的。