如何使用java在hashmap中返回最大值及其键

如何使用java在hashmap中返回最大值及其键,java,hashmap,Java,Hashmap,我想在地图中找到最大值和键。如果有多个值,则返回所有条目。我如何在java中实现它 这是我有{1=1,3=1,4=3,5=1}的地图 我想将最大值与键一起返回,即4=3 我尝试了以下代码,但这里我得到了第一个迭代值,也就是1=1 Map.Entry<Foo, Bar> maxEntry = null; for (Map.Entry<Foo, Bar> entry : map.entrySet()) { if (maxEntry == null || entry.

我想在地图中找到最大值和键。如果有多个值,则返回所有条目。我如何在java中实现它

这是我有{1=1,3=1,4=3,5=1}的地图 我想将最大值与键一起返回,即4=3 我尝试了以下代码,但这里我得到了第一个迭代值,也就是1=1

Map.Entry<Foo, Bar> maxEntry = null;

for (Map.Entry<Foo, Bar> entry : map.entrySet())
{
    if (maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0)
    {
        maxEntry = entry;
    }
}

此外,如果有多条记录具有相同的值,请将它们全部打印出来。以下是使用流的示例:

import java.awt.Point;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class StreamMaxFind {
    public final static void main(String[] args) {
        HashMap<String, Point> points = new HashMap<>();
        points.put("p1", new Point(10,20));
        points.put("p2", new Point(20,30));
        points.put("p3", new Point(2,6));
        points.put("p4", new Point(3,16));
        points.put("p5", new Point(-20,-30));

        Map<Double, List<Map.Entry<String, Point>>> groups = points.entrySet().stream()
            .collect(Collectors.groupingBy(elem -> Double.valueOf(getLen(elem))));

        Map.Entry<Double, List<Map.Entry<String, Point>>> maxVals = groups.entrySet().stream()
            .max((elem1, elem2) -> {
                return elem1.getKey().compareTo(elem2.getKey());
            })
            .get();

        System.out.println("max val: " + maxVals.getKey());
        maxVals.getValue().stream()
            .forEach(point -> {
                System.out.println("Key of point: " + point.getKey());
                System.out.println("max val x " + point.getValue().getX());
                System.out.println("max val y " + point.getValue().getY());
            });
    }

    private static double getLen(Map.Entry<String, Point> point1) {
        double x1 = point1.getValue().getX();
        double y1 = point1.getValue().getY();
        return Math.sqrt(x1*x1 + y1*y1);
    }
}

我假设你把它作为家庭作业,所以这个解决方案可能没有帮助,因为我可能使用了你还不知道的技术。正如评论者已经告诉你的那样,你应该提供更多关于你迄今为止所做的事情以及你的实际问题所在的信息。只是将此解决方案交给导师而不解释其背后的逻辑,在将来对您没有帮助。

通过迭代映射条目。但这并不是很理想。要求家庭作业帮助的问题必须包括你迄今为止为解决问题所做的工作的摘要,以及你解决问题的困难的描述。请展示你迄今为止所做的尝试,以及至少一些输入和所需的输出示例。一般的过程是迭代元素并始终记住当前最大值,在遍历元素时更新它。如果您需要高效的操作,您可能需要一个不同的数据结构,一个自动排序的数据结构。请确保Bar的compareTo方法实际上是正确比较的。如果有多个值,则返回所有的条目不会执行此操作。@AndyTurner是的,“我在阅读问题时错过了这个要求。”安德特特纳纠正了这个问题。