[Java] Stream Comparator 내림, 오름차순 정렬 관련

박철현·2023년 5월 11일

개념정리

목록 보기
3/5

Stream Comparator를 활용한 내림, 오름차순 관련 정렬

  • Comparactor 객체의 comparing 메서드를 활용한 정렬 가능
    • 내림차순 정렬을 하고싶다면 메서드 내에 2번째 인자로 Comparator.reverseOrder() 메서드 사용
  • 2번째 정렬 기준이 필요하다면 comparing 메서드 괄호 뒤에 .thenComparing 메서드 사용
  • 괄호가 많으니 주의! 가독성을 위해 아래와 같이 괄호 여는곳에서 줄바꿈 하는 습관을 들여야겠다.
People = People.stream()
    .sorted(
        Comparator.comparing(
        (Person p) -> p.getFromMember().getGender(), Comparator.reverseOrder()
        )
        .thenComparing(
        p -> p.getCreateDate(), Comparator.reverseOrder()
        )
    )
    .collect(Collectors.toList());
  • thenComparing() 말고도 .reverse() 메서드가 있어 차이점도 정리하고자 한다.
thenComparingreversed
기존 정렬순서 유지한 채로 추가 정렬 규칙 적용정렬 순서를 반대로 뒤집음
이미 정렬된 상태에서 두번째 우선순위 적용이미 정렬된 상태를 역순으로 뒤집음

-> reversed는 그냥 뒤집기만 한다..!

// thenComparing() 예제
// 이름으로 먼저 오름차순 정렬한 다음에 나이순 오름차순 정렬(기준 2개)
List<Person> sortedPeople1 = people.stream() 
.sorted(
Comparator.comparing(Person::getName)
.thenComparingInt(Person::getAge)
)
.collect(Collectors.toList());

// reversed() 예제
// 이름 기준 오름차순 정렬하고 정렬 순서를 반대로 뒤집음 -> 이름 기준 내림차순 정렬
// 기존의 정렬 순서를 뒤집을 때 사용
List<Person> sortedPeople2 = people.stream()
    .sorted(Comparator.comparing(Person::getName).reversed())
    .collect(Collectors.toList());

-> 두 메서드의 결과를 같게도 짤 수 있지만, 정렬의 의도를 더 잘 나타내기 위해 Comparator.reverseOrder() 사용 권장

// 역순 정렬에서 동일하게 사용 예제
// 코드 기준 정렬하고 2순위로 생성일자 오름차순 한다음에 생성일순 정렬 뒤집기
// thenComparing 안에 있지만 괄호별로 줄 바꿈 등을 안하면, 뭔가 전체 다 진행하고 총 결과를 뒤집는 것으로 오해할 수 있을듯한 
People = likeablePeople.stream()
.sorted(
Comparator.comparing(Person::getCode)
.thenComparing(
Comparator.comparing(Person::getCreateDate)
.reversed()
  )
)
.collect(Collectors.toList());

// Comparator.reverseOrder()로 좀 더 명확하게
// 역순을 어떤 기준으로 할 지 보다 명확하게 파악 가능
likeablePeople = likeablePeople.stream()
.sorted(
Comparator.comparing(LikeablePerson::getAttractiveTypeCode)
// 2번째 인자에 넣어주면 역순 정렬 가능
.thenComparing(
Comparator.comparing(LikeablePerson::getCreateDate, Comparator.reverseOrder())
  )
)
.collect(Collectors.toList());
                        
  • 출처 : GPT
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글