猿问

使用 Java Streams 从嵌套列表创建 TreeMap

给定: 我有List<List<Integer>> locations一个位置的坐标。例如,地点 A:(2,4),地点 B:(5,4),地点 C:(10,9),地点 D:(2,4)。所以我locations将包含列表列表。我无法更改此格式。


前往特定位置的成本是坐标和的平方根。所以去的成本是Place A = Math.sqrt(2 + 4),去的成本Place B = Math.sqrt(5 + 4)等等。


输出:我想要得到的是所有位置中“成本最低”的列表。退货的要求是List<List<Integer>> nearestLocations。我所做的是我正在尝试创建一个TreeMap<Double, List<List<Integer>>


问题 我的问题是如何使用 Java 8 流转换下面的转换?


 List<List<Integer>> findNearestLocation(int total, List<List<Integer>> allLocations, int size) {

        ArrayList<List<Integer>> results = new ArrayList<>();

        TreeMap<Double, List<Integer>> map = new TreeMap<>();

        for (int i = 0; i < total && i < allLocations.size(); i++) {

            List<Integer> list = allLocations.get(i);

            double l = 0.0;

            for (Integer x : list) {

                l += x * x;

            }

            map.put(Math.sqrt(l), list);

        }

        if (map.size() > 0) {

            for (int get = 0; get < size; get++) {

                results.add(map.get(map.firstKey()));

                map.remove(map.firstKey());

            }


        }

        return results;

    }


蝴蝶不菲
浏览 471回答 2
2回答

红颜莎娜

你Map实际上是Map<Double, List<Integer>>您当前的代码仅Map在您TreeMap需要时返回:&nbsp; &nbsp; TreeMap<Double, List<List<Integer>>> x = locations.stream().collect(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Collectors.groupingBy((List<Integer> b) -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; double d = b.stream().mapToDouble(i -> i.doubleValue()).sum();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Math.sqrt(d);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TreeMap::new,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Collectors.toList()));PS:你的距离不是通常的欧式距离。为了做到这一点,你需要i -> i.doubleValue() * i.doubleValue()

犯罪嫌疑人X

如果您只想按距离对该列表进行排序,您可以这样做Collections.sort(list,&nbsp;(list1,&nbsp;list2)&nbsp;->&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;Double.compare(Math.sqrt(list1.get(0)&nbsp;+&nbsp;list1.get(1)), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Math.sqrt(list2.get(0)&nbsp;+&nbsp;list2.get(1))));或者如果初始列表是不可变的,则在列表的副本上。
随时随地看视频慕课网APP

相关分类

Java
我要回答