在获取手机通讯录项目中,对名字的首字母进行排序时,用到Collections.sort方法
Collections.sort(contacts, new Comparator<ContactBean>() {
// Comparator接口可重新compare方法
@Override
public int compare(ContactBean lhs, ContactBean rhs) {
if (lhs.getName() != null && rhs.getName() != null) {
String lhsName = PinYinUtils.trans2PinYin(lhs.getName())
.toUpperCase();
String rhsName = PinYinUtils.trans2PinYin(rhs.getName())
.toUpperCase();
return lhsName.compareTo(rhsName);
}
return 0;
}
});
遇到的错误:
Java.lang.IllegalArgumentException: Comparison method violates its
general contract!
网上解释:
度娘之后.原来是 jdk1.7中修改了 Array.sort的算法.不在使用之前MergeSort ,而是使用新的TimeSort,其对象间的要求更加严格
a). sgn(compare(x, y)) == -sgn(compare(y, x))
b). (compare(x, y)>0) && (compare(y, z)>0) 意味着 compare(x, z)>0
c). compare(x, y)==0 意味着对于任意的z:sgn(compare(x, z))==sgn(compare(y, z)) 均成立
详情阅读.Comparator.compare 方法说明
解决方法:
一:改一下系统设置,还是选择使用老版本的排序方法,在代码前面加上这么一句话:System.setProperty(“java.util.Arrays.useLegacyMergeSort”,
“true”);二:采用Collections.sort 来对文件进行排序,出现 Comparison method violates its
general contract 异常, 找了好久,才发现是实现接口Comparator 的类有问题,
在compare中没有处理好两个比较的对象相等的情况三:try-catch捕获异常
try { ...... } catch (IllegalArgumentException e)
{
Log.e("error", "Comparison method violates its general contract!"); }