프로그래밍 공부

자바 컬렉션 - 객체 정렬 본문

Programming/JAVA

자바 컬렉션 - 객체 정렬

khj1999 2024. 10. 9. 13:14

객체를 정렬 하는 방법

  • Java에서 객체를 정렬하기 위해 Comparable 인터페이스를 구현하거나
    Comparator를 사용해야함

1. Comparable 인터페이스 구현

  • Comparable 인터페이스는 객체의 자연 순서를 정의하는 데 사용.

  • 이 인터페이스를 구현하면 객체를 정렬할 수 있는 기준을 제공할 수 있음.

  • compareTo(T o) 메서드를 구현해야 하며, 이 메서드는 두 객체를 비교하여 정렬 순서를 결정.

  • 예제: Comparable을 이용한 정렬

      import java.util.ArrayList;
      import java.util.Collections;
      import java.util.List;
    
      class Person implements Comparable<Person> {
          String name;
          int age;
    
          Person(String name, int age) {
              this.name = name;
              this.age = age;
          }
    
          @Override
          public int compareTo(Person other) {
              return Integer.compare(this.age, other.age); // 나이에 따라 정렬
          }
    
          @Override
          public String toString() {
              return name + " (" + age + ")";
          }
      }
    
      public class ComparableExample {
          public static void main(String[] args) {
              List<Person> people = new ArrayList<>();
              people.add(new Person("Charlie", 30));
              people.add(new Person("Alice", 25));
              people.add(new Person("Bob", 28));
    
              System.out.println("Before sorting: " + people);
    
              // Comparable에 의해 정렬
              Collections.sort(people);
    
                      // 출력: [Alice (25), Bob (28), Charlie (30)]
              System.out.println("After sorting by age: " + people);
          }
      }
    

    설명

    • Person 클래스는 Comparable<Person> 인터페이스를 구현.
    • compareTo 메서드에서 나이를 비교하여 정렬 기준을 정의.
    • Collections.sort(people)를 호출하면 Person 객체가 나이에 따라 정렬.

2. Comparator 인터페이스 사용

  • Comparator 인터페이스는 객체의 정렬 기준을 외부에서 정의할 수 있게 해 줌.

  • 이 방법은 기존 클래스의 정렬 기준을 변경하거나 여러 정렬 기준을 정의할 때 유용함.

  • 람다식으로 사용가능

  • 예제: Comparator를 이용한 정렬

      import java.util.ArrayList;
      import java.util.Collections;
      import java.util.Comparator;
      import java.util.List;
    
      class Person {
          String name;
          int age;
    
          Person(String name, int age) {
              this.name = name;
              this.age = age;
          }
    
          @Override
          public String toString() {
              return name + " (" + age + ")";
          }
      }
    
      // Comparator를 구현한 클래스, 외부에서도 구현 가능
      class AgeComparator implements Comparator<Person> {
          @Override
          public int compare(Person p1, Person p2) {
              return Integer.compare(p1.age, p2.age); // 나이에 따라 비교
          }
      }
    
      public class ComparatorExample {
          public static void main(String[] args) {
              List<Person> people = new ArrayList<>();
              people.add(new Person("Charlie", 30));
              people.add(new Person("Alice", 25));
              people.add(new Person("Bob", 28));
    
              System.out.println("Before sorting: " + people);
    
              // Comparator를 이용한 나이 기준 정렬
              Comparator<Person> ageComparator = new Comparator<Person>() {
                  @Override
                  public int compare(Person p1, Person p2) {
                      return Integer.compare(p1.age, p2.age); // 나이에 따라 정렬
                  }
              };
    
              Collections.sort(people, ageComparator);
    
                      // 출력: [Alice (25), Bob (28), Charlie (30)]
              System.out.println("After sorting by age: " + people);
    
              // 이름 기준 정렬
              Comparator<Person> nameComparator = new Comparator<Person>() {
                  @Override
                  public int compare(Person p1, Person p2) {
                      return p1.name.compareTo(p2.name); // 이름에 따라 정렬
                  }
              };
    
              Collections.sort(people, nameComparator);
    
              // 출력: [Alice (25), Bob (28), Charlie (30)]
              System.out.println("After sorting by name: " + people);
    
              // 나이 기준 정렬 (람다 사용)
              Collections.sort(people, (p1, p2) -> Integer.compare(p1.age, p2.age));
                      // 출력: [Alice (25), Bob (28), Charlie (30)]
              System.out.println("After sorting by age: " + people);
    
              // 이름 기준 정렬 (람다 사용)
              Collections.sort(people, (p1, p2) -> p1.name.compareTo(p2.name));
    
                      // 출력: [Alice (25), Bob (28), Charlie (30)]
              System.out.println("After sorting by name: " + people);
          }
      }
    

    설명

    • Person 클래스는 Comparable을 구현하지 않지만, Comparator를 사용하여 정렬 기준을 정의.
    • 첫 번째 정렬 기준으로 나이에 따라 정렬하는 ageComparator를 정의.
    • 두 번째 정렬 기준으로 이름에 따라 정렬하는 nameComparator를 정의.
    • Collections.sort(people, ageComparator)Collections.sort(people, nameComparator)를 통해 각각 나이와 이름에 따라 정렬.

요약

  • Comparable
    • 객체 자체에 자연 순서를 정의할 때 사용함
    • 클래스에서 Comparable 인터페이스를 구현하고 compareTo() 메서드를 오버라이드하여
      정렬 기준을 설정.
  • Comparator
    • 외부에서 정렬 기준을 정의할 때 사용.
    • Comparator 인터페이스를 구현한 객체를 사용하여 compare() 메서드를 통해 원하는
      정렬 기준을 설정.
    • 여러 기준으로 정렬할 수 있는 유연성을 제공

'Programming > JAVA' 카테고리의 다른 글

JAVA의 함수형 프로그래밍  (1) 2024.10.21
자바 제네릭  (0) 2024.10.09
자바 컬렉션 - Map  (0) 2024.10.08
자바 컬렉션 - Queue, PriorityQueue  (0) 2024.10.08
자바 컬렉션 - Set 인터페이스  (0) 2024.10.08
Comments