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

时间:2019-01-11 10:06:53

标签: java algorithm java-8 java-stream 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;
    }

2 个答案:

答案 0 :(得分:3)

您的@EventListener(ApplicationReadyEvent.class) public void listenToRequestCommands() { firestoreConnection.listCollections().forEach(collectionReference -> { collectionReference .document(properties.getFirestoreCommand()) .addSnapshotListener((snapshot, e) -> { Object o = snapshot.get("timestamp"); Timestamp ts = (Timestamp) snapshot.get("timestamp"); } ); }); } 实际上是Map

如果您需要Map<Double, List<Integer>>,则您当前的代码仅返回Map

TreeMap

PS:您的距离不是通常的欧几里得距离。为此,您需要 TreeMap<Double, List<List<Integer>>> x = locations.stream().collect( Collectors.groupingBy((List<Integer> b) -> { double d = b.stream().mapToDouble(i -> i.doubleValue()).sum(); return Math.sqrt(d); }, TreeMap::new, Collectors.toList()));

答案 1 :(得分:1)

如果您只想按列表的距离对列表进行排序,则可以

Collections.sort(list, (list1, list2) -> 
    Double.compare(Math.sqrt(list1.get(0) + list1.get(1)),
                   Math.sqrt(list2.get(0) + list2.get(1))));

,或者如果初始列表是不可变的,则在列表的副本上。