Сортировать список по нескольким полям (не сравнивать) в java - PullRequest
2 голосов
/ 06 августа 2020

Теперь у меня есть объект:

public class Room{
    private long roomId;
    private long roomGroupId;
    private String roomName;
    ... getter 
    ... setter
}

Я хочу отсортировать список комнат по 'roomId', но тем временем, пока объекты комнаты имеют 'roomGroupId' больше нуля и имеют такое же значение, затем сделайте их близко друг к другу. Позвольте мне привести пример:

input:

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

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Это не простое хорошее решение (возможно, я ошибаюсь).

Вы можете сделать это вот так

        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());
0 голосов
/ 06 августа 2020

Если вы находитесь в 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()); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...