0

我使用以下代码片段按电话号码排序:

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: 比较方法违反了它的一般约定!

我搜索了一下,发现这意味着我的排序算法不是传递的......

有没有人有更好的按电话号码排序的算法?

4

1 回答 1

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 !

希望这可以帮助

于 2013-02-03T13:24:29.997 回答