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 に答える