![](/img/trans.png)
[英]How does Java decide to sort a list of objects with multiple fields, when the chosen field to compare the object is equal?
[英]Sort list by multiple fields(not then compare) in java
現在我有一個 object:
public class Room{
private long roomId;
private long roomGroupId;
private String roomName;
... getter
... setter
}
我想按“roomId”對房間列表進行排序,但與此同時,房間對象的“roomGroupId”大於零並且具有相同的值,然后使它們彼此靠近。 讓我舉個例子:
輸入:
[{"roomId":3,"roomGroupId":0},
{"roomId":6,"roomGroupId":0},
{"roomId":1,"roomGroupId":1},
{"roomId":2,"roomGroupId":0},
{"roomId":4,"roomGroupId":1}]
output:
[{"roomId":6,"roomGroupId":0},
{"roomId":4,"roomGroupId":1},
{"roomId":1,"roomGroupId":1},
{"roomId":3,"roomGroupId":0},
{"roomId":2,"roomGroupId":0}]
如上所示,列表按 'roomId' 排序,但 'roomId 4' 和 'roomId 1' 靠得很近,因為它們具有相同的 roomGroupId。
這沒有簡單的好解決方案(也許我錯了)。
你可以這樣做
TreeMap<Long, List<Room>> roomMap = new TreeMap<>();
rooms.stream()
.collect(Collectors.groupingBy(Room::getRoomGroupId))
.forEach((key, value) -> {
if (key.equals(0L)) {
value.forEach(room -> roomMap.put(room.getRoomId(), Arrays.asList(room)));
} else {
roomMap.put(
Collections.max(value, Comparator.comparing(Room::getRoomId))
.getRoomId(),
value
.stream()
.sorted(Comparator.comparing(Room::getRoomId)
.reversed())
.collect(Collectors.toList())
);
}
});
List<Room> result = roomMap.descendingMap()
.entrySet()
.stream()
.flatMap(entry -> entry.getValue()
.stream())
.collect(Collectors.toList());
如果你在 Java 8,你可以使用這樣的代碼
Collections.sort(roomList, Comparator.comparing(Room::getRoomGroupId)
.thenComparing(Room::getRoomId));
如果沒有,您應該使用比較器
class SortRoom implements Comparator<Room>
{
public int compare(Room a, Room b)
{
if (a.getRoomGroupId().compareTo(b.getRoomGroupId()) == 0) {
return a.getRoomId().compareTo(b.getRoomId());
}
return a.getRoomGroupId().compareTo(b.getRoomGroupId();
}
}
然后像這樣使用它
Collections.sort(roomList, new SortRoom());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.