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 |