Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java7中,从具有与列表对应的键的映射中获取最大值_Java_List_Collections_Hashmap - Fatal编程技术网

在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()
        );
    }