본문 바로가기
Java

[자바 이슈] Comparator 사용 관련 주의

by Sky Titan 2020. 9. 9.
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]);

 그리고 나중에 고친 코드이다. (람다식은 중요하지 않다.)

 이건 정상적으로 돌아가는 코드인데 이유를 알고 싶어서 검색을 해보다 백준에서 글을 발견했다.

 

 

 

글 읽기 - 런타임에러가 왜 생기죠?

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 사실 무슨 얘기인진 이해를 잘 못했는데 어쨌든 결론은 내림차순 정렬이라는 가정하에

 

//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

댓글