我使用以下代码段按电话号码排序:
class Item { String addr; /* phone number */ }
private int compareByAddr(Item objA, Item objB) {
if (objA.addr==null && objB.addr==null) {
return 0;
} else if (objA.addr==null && objB.addr!=null) {
return -1;
} else if (objA.addr!=null && objB.addr==null) {
return 1;
} else {
if (PhoneNumberUtils.compare(objA.addr, objB.addr)) {
return 0;
} // end if
return objA.addr.compareTo(objB.addr);
} // end if
} // end compareByAddr()
但是我得到了一个例外:
E / AndroidRuntime(12157):java.lang.IllegalArgumentException: 比较方法违反了其总契约!
我搜索过它,发现这意味着我的排序算法不具有传递性......
有没有人有更好的按电话号码排序的算法?
答案 0 :(得分:0)
问题是你有2个代表电话号码的字符串,你想要比较它们并将它们从大到小排序,就像有数字一样......
但将2个字符串与其他字符串进行比较(如代码片段中所示):
objA.addr.compareTo(objB.addr);
不会工作:(
你可以通过操纵字符串到一个数字(并丢弃它的所有非数字)来做到这一点 然后将2比作常规数字......
String phone1Str
String phone2Str
int phone1
int phone2
phone1Str= phone1Str.replaceAll("\\D+",""); //using reg-ex to get only digits
phone1= Integer.valueOf(phone1Str); //convert to int to compare numbers
phone2Str= phone2Str.replaceAll("\\D+","");
phone2= Integer.valueOf(phone2Str);
if (PhoneNumberUtils.compare(phone1Str,phone2Str)
//they are equal
else if (phone1>phone2)
//phone1 is the larger number !
else
//phone2 is the larger number !
希望这会有所帮助