728x90
반응형
Comparable 과 Comparator 인터페이스의 차이는 무엇인가?
Comparable은 자연스러운 순서로 정렬할 때 사용.
Comparator는 원하는 대로 정렬 순서를 지정하고 싶은 곳에 사용
배열을 정렬할 때는 일반적으로 Array 나 Collection 클래스의 내장된 라이브러리를 사용한다.
Array와 Collection 클래스는 몇 가지 오버로딩된 정렬 메서드가 있다.
- 배열을 매개변수로 받는 메서드
- Comparator 객체를 매개변수로 받는 메서드
@org.junit.Test
public void sortInts(){
final int[] numbers = {-3, -5, 1, 7, 4, -2};
final int[] expected = {-5, -3, -2, 1, 4, 7};
Arrays.sort(numbers);
Assert.assertArrayEquals(expected, numbers);
}
@org.junit.Test
public void sortObjects(){
final String[] strings = {"z", "x", "y", "abc", "zzz", "zazzy"};
final String[] expected = {"abc", "x", "y", "z", "zazzy", "zzz"};
Arrays.sort(strings);
Assert.assertArrayEquals(expected, strings);
}
위의 두 테스트는 성공하는 것을 볼 수 있는데, String 클래스는 Comparable 인터페이스가 구현되어 있기 때문에 예상한대로 정렬이 된다.
정렬해야 하는 타입이 Comparable 인터페이스를 구현하지 않으면 ClassCastException 예외가 발생한다.
sort 메서드 시그니처
public static <T extends Comparable<? super T>> void sort(List<T> list);
지정한 순서대로 정렬하고 싶으면 sort 메서드에서 사용할 Comparator 인터페이스를 구현한 후 이를 sort메서드에 제공해야 한다.
Comparator인터페이스를 구현하여 숫자의 역순으로 정렬하기
public class ReverserNumericalOrder implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
return (o1 - o2) * -1;
}
}
@org.junit.Test
public void customSorting(){
final List<Integer> numbers = Arrays.asList(4, 7, 1, 6, 3, 5, 4);
final List<Integer> expected = Arrays.asList(7, 6, 5, 4, 4, 3, 1);
Collections.sort(numbers, new ReverserNumericalOrder());
Assert.assertEquals(expected, numbers);
}
728x90
반응형
'그 외 ... (정리해야함) > 질문과 답변' 카테고리의 다른 글
final 키워드는 객체 참조에 어떤 영향을 미치는가? (0) | 2019.05.02 |
---|---|
자바에서 객체란 무엇인가? (0) | 2019.05.02 |
Queue 와 Deque는 무엇인가? (0) | 2019.05.02 |
배열과 리스트의 관계를 알아보자. (0) | 2019.05.02 |
이진 검색(binary search)은 어떻게 구현하는가? (0) | 2019.05.02 |