按 Java 中的对象参数对 Map<Object, List<Object>> 进行排序
Sorting a Map<Object, List<Object>> by Object Parameter in Java
你能帮我整理这样一张地图吗
Map<Object, List<Object>> halls = new HashMap()<>;
其中关键对象的参数之一是 numberOfSeats
并且整个地图应该按倒序排列最多的座位。
我试着用 streamAPI 来做,但我似乎无法让它工作。
类似于:
halls.entrySet().stream().sorted((h1, h2) -> h1.getSeatsNumber.compareTo(h2.getSeatsNumber));
您可以使用按键比较,例如:
halls.entrySet().stream()
.sorted(Map.Entry.comparingByKey(Comparator.comparing(YourObject::numberOfSeats).reversed()))
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (s1, s2) -> s1, LinkedHashMap::new));
如果你想对地图进行排序,你应该使用 LinkedHashMap 例如。
而不是使用 HashMap
,而是创建一个 TreeMap
并提供一个自定义比较器:
Map<MyObject, List<MyObject>> halls = new TreeMap<>(
Comparator.comparingInt(MyObject::getSeatsNumber).reversed()
);
如果您有 MyObject
的集合需要收集到地图中,这可以使用 Collectors.groupingBy
和 TreeMap
的供应商来完成:
List<MyObject> list = new ArrayList<>(); // input list of MyObject
Map<MyObject, List<MyObject>> halls2 = list
.stream()
.collect(Collectors.groupingBy(
x -> x,
() -> new TreeMap<>(
Comparator.comparingInt(MyObject::getSeatsNumber).reversed()
),
Collectors.toList()
));
既然你明确地说你有一个Map<Object,List<Object>>
,我将把它限制在那种情况下。
首先,创建一些测试数据。
Map<Object, List<Object>> halls = Map.of(new MyClass(1),
List.of("G", "H"), new MyClass(4), List.of("C", "D"),
new MyClass(7), List.of("A", "B"), new MyClass(3),
List.of("E", "F"));
现在对现有地图进行排序。要保留排序,您可以使用 LinkedHashMap
来维护插入顺序。但是,新添加的项目不会排序,而是简单地添加到末尾。
在这种情况下,您必须将密钥转换为您的实际 class 名称才能获得席位,因为 Object
对该方法一无所知。要反转排序,只需反转 Integer.compare
方法中 e1
和 e2
的顺序即可。如果您使用 MyClass
而不是 Object
作为密钥,这可能会更容易一些。
Map<Object, List<Object>> result = halls.entrySet().stream()
.sorted((e1, e2) -> Integer.compare(
((MyClass) e2.getKey()).getSeatsNumber(),
((MyClass) e1.getKey()).getSeatsNumber()))
.collect(Collectors.toMap(Entry::getKey,
Entry::getValue, (a, b) -> a,
LinkedHashMap::new));
result.entrySet().forEach(System.out::println);
以上打印。
seats:7=[A, B]
seats:4=[C, D]
seats:3=[E, F]
seats:1=[G, H]
这是包含 toString
覆盖的测试 class。
class MyClass {
int seats = 0;
public MyClass(int seats) {
this.seats = seats;
}
public int getSeatsNumber() {
return seats;
}
public String toString() {
return "seats:"+seats;
}
}
你能帮我整理这样一张地图吗
Map<Object, List<Object>> halls = new HashMap()<>;
其中关键对象的参数之一是 numberOfSeats 并且整个地图应该按倒序排列最多的座位。 我试着用 streamAPI 来做,但我似乎无法让它工作。
类似于:
halls.entrySet().stream().sorted((h1, h2) -> h1.getSeatsNumber.compareTo(h2.getSeatsNumber));
您可以使用按键比较,例如:
halls.entrySet().stream()
.sorted(Map.Entry.comparingByKey(Comparator.comparing(YourObject::numberOfSeats).reversed()))
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (s1, s2) -> s1, LinkedHashMap::new));
如果你想对地图进行排序,你应该使用 LinkedHashMap 例如。
而不是使用 HashMap
,而是创建一个 TreeMap
并提供一个自定义比较器:
Map<MyObject, List<MyObject>> halls = new TreeMap<>(
Comparator.comparingInt(MyObject::getSeatsNumber).reversed()
);
如果您有 MyObject
的集合需要收集到地图中,这可以使用 Collectors.groupingBy
和 TreeMap
的供应商来完成:
List<MyObject> list = new ArrayList<>(); // input list of MyObject
Map<MyObject, List<MyObject>> halls2 = list
.stream()
.collect(Collectors.groupingBy(
x -> x,
() -> new TreeMap<>(
Comparator.comparingInt(MyObject::getSeatsNumber).reversed()
),
Collectors.toList()
));
既然你明确地说你有一个Map<Object,List<Object>>
,我将把它限制在那种情况下。
首先,创建一些测试数据。
Map<Object, List<Object>> halls = Map.of(new MyClass(1),
List.of("G", "H"), new MyClass(4), List.of("C", "D"),
new MyClass(7), List.of("A", "B"), new MyClass(3),
List.of("E", "F"));
现在对现有地图进行排序。要保留排序,您可以使用 LinkedHashMap
来维护插入顺序。但是,新添加的项目不会排序,而是简单地添加到末尾。
在这种情况下,您必须将密钥转换为您的实际 class 名称才能获得席位,因为 Object
对该方法一无所知。要反转排序,只需反转 Integer.compare
方法中 e1
和 e2
的顺序即可。如果您使用 MyClass
而不是 Object
作为密钥,这可能会更容易一些。
Map<Object, List<Object>> result = halls.entrySet().stream()
.sorted((e1, e2) -> Integer.compare(
((MyClass) e2.getKey()).getSeatsNumber(),
((MyClass) e1.getKey()).getSeatsNumber()))
.collect(Collectors.toMap(Entry::getKey,
Entry::getValue, (a, b) -> a,
LinkedHashMap::new));
result.entrySet().forEach(System.out::println);
以上打印。
seats:7=[A, B]
seats:4=[C, D]
seats:3=[E, F]
seats:1=[G, H]
这是包含 toString
覆盖的测试 class。
class MyClass {
int seats = 0;
public MyClass(int seats) {
this.seats = seats;
}
public int getSeatsNumber() {
return seats;
}
public String toString() {
return "seats:"+seats;
}
}