Chef.Yeon
Code Cook
Chef.Yeon
전체 방문자
오늘
어제
  • 분류 전체보기 (230)
    • 게임 개발 (1)
      • Unity (1)
    • Android (27)
      • Kotlin (19)
      • 우아한테크코스 5기 (4)
    • Language (11)
      • 파이썬 (3)
      • Java (7)
    • DB (2)
      • SQL (16)
    • Spring (25)
    • 코딩테스트 (56)
    • Git (1)
    • TIL (85)
    • DevOps (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • webflux
  • ec2
  • rsocket
  • til
  • kotlin
  • spring
  • 프로그래머스
  • 안드로이드
  • 우아한테크코스
  • enum
  • Wil
  • 백준
  • 문자열
  • 파이썬
  • 다이나믹 프로그래밍
  • elasticsearch
  • grafana
  • 에라토스테네스의 체
  • SQL
  • java
  • 코틀린
  • 내림차순
  • 레포지토리
  • kibana
  • 프리코스
  • Android
  • MariaDB
  • 코틀린 인 액션
  • Docker
  • 코딩테스트

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Chef.Yeon

Code Cook

Language/Java

[Java] 객체 배열/리스트 오름차순,내림차순 정렬과 다중 조건 정렬

2023. 3. 9. 19:29

Comparable 인터페이스 - compareTo

comparable 인터페이스의 compareTo 메서드를 오버라이드해서 사용합니다.

1) 오름차순 정렬 기준

정렬 기준을 나이 오름차순으로 정의

  • Arrays.sort(객체명), Collections.sort(객체명) 통해 사용
  • 내림차순: Collections.sort(객체명, Collections.reverseOrder()) 
  • 리스트인 경우 내림차순: 객체명.sort(Collections.reverseOrder())으로 사용 가능
import java.util.*;

public class classSort{

    static class Person implements Comparable<Person> {
        private String name;
        private int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        @Override
        public int compareTo(Person other) {
            /* 동일한 코드
            if (this.age < other.age) return -1;
            else if (this.age == other.age) return 0;
            else return 1;
             */
            return this.age - other.age;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    public static void main(String[] args) {
        List<Person> people = new ArrayList<>();
        people.add(new Person("kim", 35));
        people.add(new Person("Jen", 20));
        people.add(new Person("max", 67));
        people.add(new Person("tom", 18));

        //나이 오름차순 정렬
        Collections.sort(people);
        for (Person person : people) {
            System.out.println(person);
        }

        System.out.println();

        //나이 내림차순 정렬
        Collections.sort(people, Collections.reverseOrder());
        // people.sort(Collections.reverseOrder()); // 사용 가능
        for (Person person : people) {
            System.out.println(person);
        }
    }
}

2) 내림차순 정렬 기준

정렬 기준을 나이 내림차순으로 정의

  • Arrays.sort(객체명), Collections.sort(객체명) 통해 사용
  • 오름차순: Collections.sort(객체명, Collections.reverseOrder()) 
  • 리스트인 경우 오름차순: 객체명.sort(Collections.reverseOrder())으로 사용 가능
@Override
public int compareTo(Person other) {
    /* 동일한 코드
    if (this.age > other.age) return -1;
    else if (this.age == other.age) return 0;
    else return 1;
     */
    return other.age - this.age;
}

 

Comparator 인터페이스

기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 또는 기본 정렬기준은 클래스에 정의할 수 없을 때 Comparator를 사용할 수 있습니다.

1) 오름차순 정렬 기준

나이를 오름차순으로 정렬하는 Comparator 객체를 생성해서 comparator 인자에 넘겨서 정렬할 수 있습니다.

  • Arrays.sort(객체명, comparator) 또는 Collection.sort(객체명, comparator)의 comparator 인자에 넘겨주기
  • 내림차순: comparator 인자에 comaparator.reversed() 넘겨주기
    public static void main(String[] args) {
        /* 내용 생략 */
        Comparator<Person> comparator = new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o2.age - o1.age;
            }
        };

        // 오름차순 정렬
        Collections.sort(people, comparator);
        for (Person person : people) {
            System.out.println(person);
        }

        System.out.println();

        // 내림차순 정렬
        Collections.sort(people, comparator.reversed());
        // people.sort(comparator.reversed()); // 사용 가능
        for (Person person : people) {
            System.out.println(person);
        }
    }

 

2) 내림차순 정렬 기준

위 의 compare 메서드에서 return o2.age - o1.age 를 사용하면 내림차순 정렬 기준으로 바꿀 수 있습니다. 

Comparator<Person> comparator = new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        return o2.age - o1.age;
    }
};

 

Stream 사용

stream을 사용해서 나이 오름차순과 내림차순으로 간단하게 정렬이 가능합니다.

public static void main(String[] args) {
    /* 내용 생략 */

        List<Person> sortedPeople = new ArrayList<>();

        //오름차순 정렬
        sortedPeople = people.stream()
                .sorted((p1, p2) -> p1.age - p2.age)
                .collect(Collectors.toList());
        for (Person person : sortedPeople) {
            System.out.println(person);
        }

        //내림차순 정렬
        sortedPeople = people.stream()
                .sorted((p1, p2) -> p2.age - p1.age)
                .collect(Collectors.toList());
        for (Person person : sortedPeople) {
            System.out.println(person);
        }
}

 

Comparator → 람다 함수 대체

public static void main(String[] args) {
    /* 내용 생략 */

    // 오름차순 정렬
    Collections.sort(people, (p1, p2) -> p1.age - p2.age);
    for (Person person : people) {
        System.out.println(person);
    }

    // 내림차순 정렬
    Collections.sort(people, (p1, p2) -> p2.age - p1.age);
    for (Person person : people) {
        System.out.println(person);
    }
}

 

다중 정렬

Comparator - comparing, thenComparing

점수를 비교해서 내림차순으로 정렬하고, 이후에 나이를 오름차순 비교하도록 했습니다.

점수가 높은 사람이 가장 앞에 나오고, 점수가 같으면 더 어린 사람이 앞에 나오는 것을 확인할 수 있습니다.

import java.util.*;

public class multipleSort {
    static class Student {
        private String name;
        private int age;
        private int score;

        /* 생성자, Getter, toString 생략 */
    }

    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("kim", 15, 70));
        students.add(new Student("tom", 19, 40));
        students.add(new Student("alice", 17, 70));
        students.add(new Student("jen", 17, 90));

        //점수 내림차순 정렬 > 나이 오름차순 정렬
        students.sort(Comparator.comparing(Student::getScore, Comparator.reverseOrder())
                .thenComparing(Student::getAge));
        /*students.sort(Comparator.comparing(Student::getScore, Collections.reverseOrder())
                .thenComparing(Student::getAge)); // 사용 가능 */
        for (Student student : students) {
            System.out.println(student);
        }
    }
}

728x90

'Language > Java' 카테고리의 다른 글

[Java] Dynamic Programming, DP에 대해 알아보자  (0) 2023.03.11
[Java] 스트림이란? 스트림stream 사용하기  (0) 2023.03.11
[Java] String 배열 대소문자 구분 없이 오름차순/내림차순 정렬하기  (0) 2023.03.10
[Java] int 배열, List 오름차순/내림차순 정렬  (0) 2023.03.09
[Java] Collection에 저장된 요소 출력하기 (Iterator, ListIterator)  (0) 2023.03.07
    'Language/Java' 카테고리의 다른 글
    • [Java] 스트림이란? 스트림stream 사용하기
    • [Java] String 배열 대소문자 구분 없이 오름차순/내림차순 정렬하기
    • [Java] int 배열, List 오름차순/내림차순 정렬
    • [Java] Collection에 저장된 요소 출력하기 (Iterator, ListIterator)
    Chef.Yeon
    Chef.Yeon
    보기 좋고 깔끔한 코드를 요리하기 위해 노력하고 있습니다.

    티스토리툴바