在Java7中,从具有与列表对应的键的映射中获取最大值
我有一张在Java7中,从具有与列表对应的键的映射中获取最大值,java,list,collections,hashmap,Java,List,Collections,Hashmap,我有一张地图和一张列表 该列表实际上包含地图的可能键。 现在,我想要地图中对应于键列表的最大值 对于eg: 地图 (a,3), (b,4), (c,5), (d,6), (e,7) 名单 b,, d 输出应为=6 当前解决方案: public Double getMaxValue(final List<String> list, final Map<String,Double> map) { Double maxDiscount = 0d; for (S
地图
和一张列表
该列表实际上包含地图的可能键。
现在,我想要地图中对应于键列表的最大值
对于eg:
地图
(a,3),
(b,4),
(c,5),
(d,6),
(e,7)
名单
b,,
d
输出应为=6
当前解决方案:
public Double getMaxValue(final List<String> list, final Map<String,Double> map) {
Double maxDiscount = 0d;
for (String key : list) {
Double discount = map.get(key);
if (discount > maxDiscount) {
maxDiscount = discount;
}
}
return maxDiscount;
}
public Double getMaxValue(最终列表,最终映射){
双倍最大折扣=0d;
for(字符串键:列表){
双重折扣=map.get(键);
如果(折扣>最大折扣){
最大折扣=折扣;
}
}
退货折扣;
}
如何才能更有效地完成此任务?虽然还有其他解决方案(基于流API),但我将告诉您解决此问题的基本算法
max=Double.MIN\u值代码>
for(字符串键:list)
if(Map.contains(key))
(max
为真,则分配max=Map.get(key)
max
的值是您要查找的最大值 简单方法:
Double max = 0.; //Or your min value (-Double.MAX_VALUE if negatives are allowed)
for(String key : keyList) {
if(hashmap.contains(key) && hashmap.get(key) > max)
max = hashmap.get(key);
}
System.out.println(max);
您可以使用streams,但我不认为它真的是一个更好的解决方案(非常难以阅读,您必须使用Java 8):
这应该做到:
public Double getMaxValue(final List<String> list, final Map<String,Double> map) {
return Collections.max(
map.entrySet().stream().filter(
item -> list.contains(item.getKey())
).collect(Collectors.toMap(
e -> e.getKey(),
e -> e.getValue())
).values()
);
}
public Double getMaxValue(最终列表,最终映射){
return Collections.max(
map.entrySet().stream().filter(
item->list.contains(item.getKey())
).collect(collector.toMap)(
e->e.getKey(),
e->e.getValue()
).values()
);
}
@QualtarDemix在列表上迭代。查找列表中每个键的值。如果大于当前最大值,则更改当前最大值。完成。@QualtarDemix这回答了Willi关于如何在Kotlin中执行此操作的问题。这不是Java代码。@QualtarDemix实际上你的问题应该是:“如何更有效地完成它?”因为你已经有了一个有效的解决方案。@Willi Mentzel啊,我刚刚花了十分钟试图找出当前解决方案不起作用的原因。这就是为什么我问现在的结果是什么。“谢谢”为我节省了另外十分钟的时间,让我安心了。@BusinessPlanQuickBuilder:我真的很抱歉。(没有双关语)是的。这就是我想到的。有没有更优雅的解决方案?优雅的代码可以通过其性能、所需资源量、易维护性、易扩展性来衡量。。。ASE只是代码的几个属性。您正在查看的是哪一个,每个requiremwnt都有一些非功能属性。代码不一定要有这些质量非功能属性的详尽列表,每一个都有一些折衷…是的。这就是我想到的。有没有一个更优雅的解决方案?不是的,在引擎盖下根本不会做同样的事情。如果您只想在一条线上使用流和lambda或类似的东西,您可以使用它。但是,我不知道保存3行代码是否值得麻烦。如果包含的值为负数,那么这将不起作用,而且OP问题有一个列表,最大值对应于列表中包含的键的最大值,该值可能不是映射中包含的最大值。嗯,但仍然没有列表,此算法查找映射包含的最大值。OP提到他需要与列表中包含的键对应的最大值。这很公平。我在回答问题时通常不会非常仔细。索普说他想使用Java 7oops,但他没有看到。但是OP目前的解决方案看起来很棒。
public Double getMaxValue(final List<String> list, final Map<String,Double> map) {
return Collections.max(
map.entrySet().stream().filter(
item -> list.contains(item.getKey())
).collect(Collectors.toMap(
e -> e.getKey(),
e -> e.getValue())
).values()
);
}