在 Java 中通过对象参数对 Map 进行排序<Object, List<Object>>

问题描述 投票:0回答:3
你能帮我整理这样的地图吗

Map<Object, List<Object>> halls = new HashMap()<>;
其中关键对象的参数之一是 numberOfSeats
整个地图应按座位数倒序排列。
我尝试用streamAPI 来做,但我似乎无法让它工作。

类似:

halls.entrySet().stream().sorted((h1, h2) -> h1.getSeatsNumber.compareTo(h2.getSeatsNumber));
    
java sorting object java-stream maps
3个回答
3
投票
不要使用

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() ));
    

1
投票
您可以使用按键比较,例如:

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 。


0
投票
既然你明确表示你有一个

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

对该方法一无所知。  要反转排序,只需颠倒 
e1
 方法中 
e2
Integer.compare
 的顺序即可。  如果您使用 
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; } }
    
© www.soinside.com 2019 - 2024. All rights reserved.