按电话号码排序

时间:2013-02-03 12:38:06

标签: android sorting

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

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:   比较方法违反了其总契约!

我搜索过它,发现这意味着我的排序算法不具有传递性......

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

1 个答案:

答案 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 !

希望这会有所帮助