使用 Java 流从嵌套列表创建 TreeMap
Create a TreeMap from nested list using Java Streams
给定:
我有 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)
等等。
输出:我想要得到的是所有位置中最少 'cost' 的列表。 return 的要求是 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;
}
你的Map
实际上是Map<Double, List<Integer>>
您当前的代码 return 只是 Map
如果您想要 TreeMap
您需要:
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()));
PS: 你的距离不是通常的欧式距离。要做到这一点,你需要 i -> i.doubleValue() * i.doubleValue()
如果你只想按距离对列表进行排序,你可以这样做
Collections.sort(list, (list1, list2) ->
Double.compare(Math.sqrt(list1.get(0) + list1.get(1)),
Math.sqrt(list2.get(0) + list2.get(1))));
如果初始列表不可变,则在列表的副本上。
给定:
我有 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)
等等。
输出:我想要得到的是所有位置中最少 'cost' 的列表。 return 的要求是 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;
}
你的Map
实际上是Map<Double, List<Integer>>
您当前的代码 return 只是 Map
如果您想要 TreeMap
您需要:
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()));
PS: 你的距离不是通常的欧式距离。要做到这一点,你需要 i -> i.doubleValue() * i.doubleValue()
如果你只想按距离对列表进行排序,你可以这样做
Collections.sort(list, (list1, list2) ->
Double.compare(Math.sqrt(list1.get(0) + list1.get(1)),
Math.sqrt(list2.get(0) + list2.get(1))));
如果初始列表不可变,则在列表的副本上。