프로그래밍 공부
자바 컬렉션 - 객체 정렬 본문
객체를 정렬 하는 방법
- 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