728x90
알고리즘 문제를 풀다가 Comparator를 사용했는데 처음 보는 경우를 발견했다.
1. 런타임 에러 발생 코드
Arrays.sort(nodes, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if(o2[1] > o1[1])
return 1;
return -1;
}
});
처음에 적은 코드이다. 내림차순 정렬을 하기 위해서 자리를 바꿔야 하면 1을 반환, 아니면 -1을 반환했는데 계속 몇몇 테스트 케이스에서 런타임 에러가 발생했다.
2. 정상 동작 코드
Arrays.sort(nodes, (o1, o2) -> o2[1] - o1[1]);
그리고 나중에 고친 코드이다. (람다식은 중요하지 않다.)
이건 정상적으로 돌아가는 코드인데 이유를 알고 싶어서 검색을 해보다 백준에서 글을 발견했다.
사실 무슨 얘기인진 이해를 잘 못했는데 어쨌든 결론은 내림차순 정렬이라는 가정하에
//1번 방법
Arrays.sort(nodes, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o2[1] - o1[1];
}
});
//2번 방법
Arrays.sort(nodes, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if(o2[1] > o1[1])
return 1;
else if(o2[1] == o1[1])
return 0;
else
return -1;
}
});
이 2가지 중 하나를 사용하라는 거다. 항상 1, 0, -1을 반환할 수 있는 조건을 넣어줘서 테스트케이스에 따라서 예외 상황이 발생하지 않게 해줘야 한다는 거다.
728x90
'Java' 카테고리의 다른 글
[자바] 인터페이스 (Interface) (0) | 2020.09.15 |
---|---|
[자바] JRE, JDK (0) | 2020.09.15 |
[자바] Arrays.sort() 자바 배열 정렬 (0) | 2020.09.09 |
[자바] PriorityQueue (우선순위 큐) (0) | 2020.09.06 |
[자바] Generics 제네릭 (0) | 2020.09.03 |
댓글