在Java中按多个字段排序列表(不比较)

王劳达:

现在我有一个对象:

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}]

输出:

[{"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。

帕维尔·波利夫卡(Pavel Polivka):

这没有容易解决的好办法(也许我错了)。

你可以这样

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章