既然你特别说你有一个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 来维护插入顺序。但是,新添加的项目不会被排序,而是简单地添加到末尾。
在这种情况下,您必须将密钥转换为您的实际班级名称才能获得席位,因为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 MyClass {
int seats = 0;
public MyClass(int seats) {
this.seats = seats;
}
public int getSeatsNumber() {
return seats;
}
public String toString() {
return "seats:"+seats;
}
}