Java 에서 배열 정렬중에 다음과 같은 오류가 발생할 때가 있다.
Comparison method violates its general contract!
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:773)
at java.util.TimSort.mergeAt(TimSort.java:510)
at java.util.TimSort.mergeForceCollapse(TimSort.java:453)
at java.util.TimSort.sort(TimSort.java:250)
at java.util.Arrays.sort(Arrays.java:1438)
at sdk.algo.Koi_Delivery.main(Koi_Delivery.java:83)
확인해 보면 해당 오류는 Java7 버전의 오류이고, 9 버전에서 수정된다고 한다.
배열의 정렬중 -1, 0, 1 값이 모호하게 전달되어 객체의 우선관계가 제대로 정리가 되지 않아서 오류가 발생하는 것이다.
나는 다음의 구문에서 오류가 발생하여 이렇게 수정하였다.
추가적으로 값이 모호하다는 것은 다음과 같다.
A > B 이고, B > C 이면 A > C 로 비교가 되어야 하는데 비교가 제대로 되지 않아서 그렇다.
반환 조건에 A > C 의 결과가 -1이나 1이 아니라 0으로 반환되는 값이 있어서 그런게 아닌지 확인해 보아야 한다.
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7075600
https://parse.com/questions/illegalargumentexception-comparison-method-violates-its-general-contract
http://dertompson.com/2012/11/23/sort-algorithm-changes-in-java-7/
http://stackoverflow.com/questions/8327514/comparison-method-violates-its-general-contract
'java' 카테고리의 다른 글
[java] 스트림을 이용한 맵리듀스 워드카운트 예제 (0) | 2019.04.08 |
---|---|
아파치 커먼즈(Apache Commons) 라이브러리 (0) | 2019.03.29 |
[java] Iterator의 Fail-Fast 방식과 Fail-Safe 방식의 차이점 (0) | 2018.03.06 |
[java] HashMap과 HashTable의 차이 (0) | 2018.03.06 |
[java] SimpleDateFormat 을 이용한 날짜 변환 (0) | 2018.01.09 |