공부 참고 자료 : 윤성우의 열혈 자바 프로그래밍 공부 자료집
https://hianna.tistory.com/569
List<E>를 구현한 컬렉션 클래스들은 저장된 인스턴스를 정렬된 상태로 유지하지 않습니다.
대신에 정렬을 해야 한다면 다음 메소드를 사용해서 정렬합니다.
public static <T extends Comparable<T>> void sort(List<T> list)
sort는 Collections 클래스에 정의되어 있는 제네릭 메소드로 인자로 List<T>의 인스턴스는 모두 전달 가능합니다.
단, T는 Comparable<T> 인터페이스를 구현한 상태이어야 합니다.
● Collections.sort()
다음과 같은 형태를 가집니다.
public static void sort(List<T> list)
public static void sort(List<T> list, Comparator<? super T> c)
예시를 같이 보겠습니다.
package day19;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class SortArrayList {
public static void main(String[] args) {
// ArrayList<> 에 Array.aslist 로 각 리스트들을 넣고 정렬을 준비합니다.
ArrayList<String> list = new ArrayList<>(Arrays.asList("C", "A", "B", "a"));
System.out.println("원본 : " + list); // [C, A, B, a]
// 오름차순으로 정렬
Collections.sort(list);
System.out.println("오름차순 : " + list); // [A, B, C, a]
// 내림차순으로 정렬
Collections.sort(list, Collections.reverseOrder());
System.out.println("내림차순 : " + list); // [a, C, B, A]
// 대소문자 구분없이 오름차순
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
System.out.println("대소문자 구분없이 오름차순 : " + list); // [a, A, B, C]
// 대소문자 구분없이 내림차순
Collections.sort(list, Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER));
System.out.println("대소문자 구분없이 내림차순 : " + list); // [C, B, a, A]
}
}
Collections.sort(list);
ArrayList를 오름차순으로 정렬합니다.
Collections.sort(list, Collections.reverseOrder());
Collections.sort()의 2번째 파라미터로 내림차순 정렬을 나타내는 Comparator를 전달해서,
ArrayList를 내림차순으로 정렬하였습니다.
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
String.CASE_INSENSITIVE_ORDER 를 전달하면, 대소문자 구분없이 오름차순으로 정렬됩니다.
여기서 'a'와 'A'는 같은 순위로 취급되므로, 원래의 순서를 유지합니다.
Collections.sort(list, Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER));
대소문자 구분없이, 내림차순으로 정렬합니다.
● List.sort()
JAVA8 이후 리스트에서 sort() 메소드를 호출하여 정렬할 수 있습니다.
default void sort(Comparator<? super E> c)
아래 예시를 같이 볼게요.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
public class SortArrayList {
public static void main(String[] args) {
// ArrayList 준비
ArrayList<String> list = new ArrayList<>(Arrays.asList("C", "A", "B", "a"));
System.out.println("원본 : " + list); // [C, A, B, a]
// 오름차순으로 정렬
list.sort(Comparator.naturalOrder());
System.out.println("오름차순 : " + list); // [A, B, C, a]
// 내림차순으로 정렬
list.sort(Comparator.reverseOrder());
System.out.println("내림차순 : " + list); // [a, C, B, A]
// 대소문자 구분없이 오름차순 정렬
list.sort(String.CASE_INSENSITIVE_ORDER);
System.out.println("대소문자 구분없이 오름차순 : " + list); // [a, A, B, C]
// 대소문자 구분없이 내림차순 정렬
list.sort(Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER));
System.out.println("대소문자 구분없이 내림차순 : " + list); // [C, B, a, A]
}
}
● Comparable 인터페이스
Comparable 인터페이스는 객체 정렬 메소드인 compareTo() 메소드를 정의합니다.
같은 타입의 인스턴스를 서로 비교해야 하는 클래스들은 모두 Comparable 인터페이스를 구현합니다.
기본 정렬순서는 작은 값에서 큰 값으로 커지는 오름차순 입니다.
Comparable 인터페이스는 다음 메소드로 객체를 정렬합니다.
int compareTo(T o) // 해당 객체와 전달된 객체의 순서를 비교. |
Comparator<T> 인터페이스는 Comparable 인터페이스와 같이 객체정렬에 사용되는 인터페이스이지만
Comparator 인터페이스는 내림 차순이나 다른 조건을 기준으로 정렬하고 싶을 때 사용될 수 있습니다.
즉 정렬할 객체가 Comparable interface를 구현하고, compareTo() 메소드 안에 정렬 기준이 정의된다면, Collections.sort() 메소드를 사용하여 객체를 정렬할 수 있습니다.
● Comparator<T> 인터페이스
Comparator<T> 인터페이스의 정렬 기준 결정은
public interface Comparator<T>
→ int compare(T o1, T o2) 의 구현을 통해 이루어집니다.
Comparator 은 구현 인스턴스를 전달하여 새로운 기준을 제공합니다.
• o1이 o2보다 크면 양의 정수 반환
• o1이 o2보다 작으면 음의 정수 반환
• o1과 o2가 같다면 0 반환
Comparator는 Collections.sort() 또는 List.sort() 메소드의 파라미터로 전달되어, 정렬의 기준이 됩니다.
아래의 예시를 함께 볼게요.
class Person implements Comparable<Person> {
String name;
int age;
. . .
@Override
public int compareTo(Person p) {
return this.age - p.age;
}
}
class PersonComparator implements Comparator<Person> {
public int compare(Person p1, Person p2) {
return p2.age - p1.age;
}
}
위 예제에서 정렬의 기준은 다음과 같습니다.
• p1이 p2보다 크면 양의 정수 반환
• p1이 p2보다 작으면 음의 정수 반환
• p1과 p2가 같다면 0 반환
'자바 > 자바 입문 공부일지' 카테고리의 다른 글
자바 기초 공부 일지 45. 네스티드 클래스, 스테틱 클래스, 이너 클래스 (0) | 2022.11.03 |
---|---|
자바 기초 공부 일지 44. 열거형 (0) | 2022.11.03 |
자바 기초 공부 일지 42. 컬렉션 클래스 (5) 맵HashMap<K, V> (0) | 2022.11.03 |
자바 기초 공부 일지 41. 컬렉션 프레임 워크 (4) Queue<E> (0) | 2022.11.03 |
자바 기초 공부 일지 40. 컬렉션 프레임 워크 (3) TreeSet<E> (0) | 2022.11.02 |