Java 当我尝试订购联系人时,比较方法违反了它的一般约定

Java 当我尝试订购联系人时,比较方法违反了它的一般约定,java,android,Java,Android,我想比较我的联系人以获得字母顺序,但我有以下错误: java.lang.IllegalArgumentException: Comparison method violates its general contract! 我打电话时会发生这种情况: Collections.sort(aVoid, new CustomComparator()); 这是我的CustomComparator: public class CustomComparator implements Comparator

我想比较我的联系人以获得字母顺序,但我有以下错误:

 java.lang.IllegalArgumentException: Comparison method violates its general contract!
我打电话时会发生这种情况:

Collections.sort(aVoid, new CustomComparator());
这是我的CustomComparator:

public class CustomComparator implements Comparator<ContactItems> {
        @Override
        public int compare(ContactItems o1, ContactItems o2) {
            if (o1.getName() == null || o2.getName() == null)
                return 0;
            else
                return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase());
        }
    }
公共类CustomComparator实现Comparator{
@凌驾
公共整数比较(联系人项目o1、联系人项目o2){
如果(o1.getName()==null | | o2.getName()==null)
返回0;
其他的
返回o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase());
}
}

我的
aVoid
数组是类
AsyncTaskGetContacts扩展AsyncTask
的方法
@onPostExecute(List aVoid)
的结果。请考虑三个值,
A
B
C
。假设
A
的名称为空,而
B
C
的名称为非空不同

在比较器中,
compare(A,B)
将返回0。而
比较(A,C)
将返回0。根据比较器的一般约定,如果A==B和A==C,那么B==C。但对于您的数据集来说,情况并非如此。这意味着
compare
方法中存在错误

您需要更好的方法来处理空值。大概是

public int compare(...) {
    if (o1.getName() == null && o2.getName() == null) {
        return 0;
    } else if (o1.getName() == null) {
        return 1;
    } else if (o2.getName() == null) {
        return -1;
    } else {
        return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase());
    }
}

你能分享一下你是如何填充
aVoid
数组的吗?我已经编辑了要求你显示填充
aVoid
的代码的问题。永远不要描述代码,总是展示出来。你比我快