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
的代码的问题。永远不要描述代码,总是展示出来。你比我快