자바/자바 입문 공부일지

자바 기초 공부 일지 43. ArrayList 정렬하기, Comparable과 Comparator, Comparator<T>

Tomitom 2022. 11. 3. 14:01
반응형

공부 참고 자료 : 윤성우의 열혈 자바 프로그래밍 공부 자료집 

https://hianna.tistory.com/569

 

[Java] ArrayList 정렬하기 (오름차순, 내림차순, 사용자 정의)

Collections.sort() 오름차순으로 정렬하기 내림차순으로 정렬하기 대소문자 구분없이 정렬하기 List.sort() - Java 8 이후 오름차순으로 정렬하기 내림차순으로 정렬하기 대소문자 구분없이 정렬하기 사

hianna.tistory.com

 

 

 

 

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 반환

 

 

반응형