JAVA에서 리스트를 정렬하고자 할 때는 java.util.Collections의 static method인 sort를 활용할 수 있다.


일반적으로 문자나 숫자를 오름차순 또는 내림차순으로 정렬할시에는 

Collections.sort(ArrayList<T> list) 와 Collections.reverse(ArrayList<T> list) 를 활용하여 쉽게 정렬된 결과를 얻을수 있다.


이는 아래 String 클래스처럼 T클래스가 Comparable<T> 을 상속받아 구현해 놓았기 때문이다.

(정확히는 Comparable 인터페이스의 compareTo 메서드를 오버라이딩)











하지만, 일반적인 케이스에서 벗어나서 특정한 규칙에 따라 정렬하고자 하면 다음 두가지 방법으로 할 수 있다.


1. 정렬하고자 하는 객체의 클래스에 Comparable 인터페이스를 implements 하고 compareTo 메서드를 오버라이드하여 Collections.sort(ArratList<T> list) 로 정렬한다.


Human 클래스의 객체List를 정렬하고자 하는 경우, Human 클래스를 다음과 같이 정의하고 Collections.sort(List<Human> list) 를 사용한다.

Human 클래스 선언 예)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Human implements Comparable<Human>{
    public int age;
    public String name;
 
    // ... 기타 선언 생략
 
    public int compareTo(Human human){
 
        // 정렬규칙에 따라 this와 human의 변수를 비교 후 
        // -1,0,1 반환
        // this가 큰 조건에서 1
 
    }
 
}
cs



2. Collections.sort(ArrayList<T> list, Comparator<T> c) 를 활용하여 정렬한다.


Human 클래스는 건들지 않고 Comparator 인터페이스를 구현한 클래스를 만들어 그 객체를 sort 메서드에 함께 전달한다.

Collections.sort(List<human> list, new HumanComparator()) 으로 사용한다.


이 때, Comparator에는 compare()와 equals() 메서드가 있으며 equlas()메서드는 Object클래스에서 정의가 되어있으므로, 

compare()만 오버라이드해서 사용하면 된다.


Collections.sort 메서드에 같이 인자로 전달되는 Comparator 선언 예)

1
2
3
4
5
6
7
8
9
10
class HumanComparator implements Comparator<Human>{
 
    @Override
    public int compare(Human o1, Human o2) {
 
        // 정렬 규칙에 따라 -1,0,1 반환
        // 첫번째 인자(o1)이 크면 1 반환
    }
        
}
cs




정리한다면, 클래스를 정렬가능(Comparable)하게 하던가 정렬시킬수 있는 도구(Comparator)를 같이 던져주던가

두가지 방법으로 정렬시킬수 있다.


끝.


 

'개발 > JAVA' 카테고리의 다른 글

Comparator, Comparable 어떻게 사용할까?  (0) 2020.11.29
LocalDateTime, ZonedDateTime  (0) 2019.10.11
BigDecimal & BigInteger  (0) 2017.04.18
Array 와 ArrayList 사이의 변환  (0) 2017.03.28
9. 생성자와 가비지 컬렉션  (0) 2017.02.22

+ Recent posts