0

私は何人かの選手を獲得したランの量でコンパレーターと比較しようとしています.

System.out.println("Comparing: " + p2.getRuns() + " and " + p1.getRuns());
int newRESULT = intConvert(p2.getRuns()).compareTo(intConvert(p1.getRuns()));
System.out.println("Returns: " + newRESULT);
return newRESULT;

ただし、これは次を返します。

比較: 25 と 0、戻り値: 2

比較: 0 と 100、戻り値: -1

比較: 25 と 100、戻り値: 1

...したがって、プレーヤーを間違った順序で並べます。

最初の比較は 1 を返すべきではなく、2 番目の比較は -1 を返し、最後の比較も同様に -1 を返す必要がありますか?

intConvert:

     private static String intConvert(int x)
     {
      return "" + x;
     }
4

3 に答える 3

3

anを aにintConvert(...)変換すると仮定すると、最初の文字が大きい (2 > 1) ため、よりも大きい字句比較が得られます。intString"25""100"

正しい比較を取得したい場合はints の比較に固執するかString、同じ長さの文字列を作成し、先頭に不足しているゼロを埋める必要がある場合 (例: 25 -> "025").

于 2012-05-02T17:40:12.450 に答える
0

Numbers合理的な方法で表現されているものを比較するにはString、それらをすべて同じ方法で一貫してフォーマットする必要があります。

String■ 字句比較を使用します。これは、 because is thanを意味し"5"ます。論理的に期待される出力を得るには、数値を何らかのフォーマッターでフォーマットして、字句的に比較できるようにする必要があります。> "20"5>2

"05"< "20"

最も簡単なことはString.format()、パターンを使用してすべての数値をフォーマットし、Strings一貫して語彙的に比較することです。

String.format("%04d", yourInteger);

これにより、渡されるすべての s が4桁分int左パディングされて生成されます。0

String.format("%04d", 5);

生産します0005

フォーマットする桁数を"%0Xd"どこにするかを指定します。X

于 2012-05-02T17:42:45.260 に答える
0

並べ替えるためだけに数値を文字列に変換する必要はありません。次のようなことができます。

class ComparePlayersByRuns implements Comparator<Player> {
    public int compareTo(Player p1, Player p2) {
        return p1.getRuns().compareTo(p2.getRuns());
    }
}

またはJava 8以降では、コンパレータを作成するために必要なのは次のとおりです。

Comparators.comparing(Player::getRuns);

いいえ、比較は 1、0、または -1 を返す必要はありません。ドキュメントには次のように書かれています。

戻り値:

最初の引数が 2 番目の引数より小さい、等しい、または大きい場合は、負の整数、ゼロ、または正の整数。

于 2012-05-02T17:47:35.447 に答える