마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Collections.sort() 시 IllegalArgumentException 발생 질문

0 추천

안녕하세요.

 

Collections.sort()를 이용해 ArrayList를 정렬하고 있는데, 알 수 없는 오류가 발생해 질문 드립니다.

Collections.sort(userItemList, new Comparator<UserItem>() {
                        @Override
                        public int compare(UserItem lUserItem, UserItem rUserItem) {
                            if (checkSomething(lUserItem) && checkSomething(rUserItem)) {
                                return  0;
                            } else if (checkSomething(lUserItem) && !ischeckSomething(rUserItem)) {
                                return -1;
                            } else {
                                return 1;
                            }

                        }
                    });

java.lang.IllegalArgumentException: Comparison method violates its general contract!
        at java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:862)
        at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:479)
        at java.util.ComparableTimSort.mergeForceCollapse(ComparableTimSort.java:418)
        at java.util.ComparableTimSort.sort(ComparableTimSort.java:218)
        at java.util.Arrays.sort(Arrays.java:1246)

위의 Exception이 발생합니다.

구글링 해 보니 Java SDK7 부터 sorting 알고리즘이 변경되어 발생할 수 있다고 하는데,

이게 초반에 Item을 추가하면 문제 없는데.. 계속 추가하다보면 발생하게 되네요

 

혹시 원인 아시는 분 계신가요?

 

libre2k (7,420 포인트) 님이 2016년 11월 11일 질문

1개의 답변

+1 추천
 
채택된 답변

compare 구현이 잘못되어 있습니다.

  • compare(a , b) == 1 이라면, compare(b, a) == -1 이어야 합니다.
  • compare(a, b) == 0 이라면, a.equals(b) == true 이어야 합니다.
익명사용자 님이 2016년 11월 11일 답변
libre2k님이 2016년 11월 11일 채택됨
감사합니다. 큰 도움되었습니다.
...