0

各オブジェクト内に存在するlongの値に基づいてArrayListをソートしようとしています。インターネットでさまざまな例をたどった後、次のコードを思いつきましたが、希望どおりに並べ替えられていません(オブジェクトの一部が切り捨てられているようです)。

public static Comparator<Customer> compareSIN = 
         new Comparator<Customer>() {
            public int compare(Customer cust1, Customer other) {
               String sin1 = "" + cust1.sin;
               String sin2 = "" + other.sin;
               return sin1.compareTo(sin2);
            }
         };

オブジェクトを正しくソートするのを妨げているコードの最初のスニペットに欠けていることについて教えてください。

ありがとう!

4

3 に答える 3

3

タイトルから私が推測するCustomer.sinのは-であり、問​​題はそれらを数値ではなくslongとして比較しようとしていることです。String

(例:10000は辞書式順序で2よりも小さいため、Stringここでsを使用するのは誤りです)

使用する必要がありますLong.compare()(Java 7を想定):

public static Comparator<Customer> compareSIN = 
         new Comparator<Customer>() {
            public int compare(Customer cust1, Customer other) {
               return Long.compare(cust1.sin,other.sin);
            }
         };
于 2012-10-22T22:48:44.633 に答える
2

compareTo()実際には、独自のメソッド内でメソッドを使用する必要はありませんcompareTo()

との比較では、等しい場合は0を返し、等しくない場合は負または正の数を返す必要があると述べています。

このため、一方を他方から減算して返すことにより、2つのロングを比較できます。

public int compare(Customer cust1, Customer other) {
           return cust1.sin - other.sin;
}

ご覧のとおり、これは、等しい場合は0を返し、other.sinがcust1.sinより大きい場合は負、cust1.sinがother.sinより大きい場合正を返します

于 2012-10-22T22:48:19.573 に答える
0

Stringsの代わりにsを比較しlongます。

したがって、「10」と「5」を比較したいとします。結果は「10」<「5」になりますが、作業していると考えると、 10>5longになると予想されます...

それはあなたの問題を説明することができます。

于 2012-10-22T22:54:00.517 に答える