3

私はintで満たされたリストを持っています:

List collection = new ArrayList();
collection.add(this.score1);
collection.add(this.score2);
collection.add(this.score3);

ここで、最高スコアと個々のスコアを比較して、どれが最高かを確認したいと思います。直感的に私はそれを次のようにしようとしました:

String highestScore;

if(Collections.max(collection) == this.score1) {
highestScore = "Score 1";
}

if(Collections.max(collection) == this.score2) {
highestScore += ", Score 2";

}

if(Collections.max(collection) == this.score3) {
highestScore += ", Score 3";

}

でも、

Collections.max(collection) == this.score1
Collections.max(collection) == this.score2
Collections.max(collection) == this.score3

すべて私にエラーを与えます:

互換性のないオペランド型 Comparable と int

ただし、これはうまくいくようです:

int highestScoreValue =  Collections.max(collection);

さて、それはどのようにできますか?

Java で int を に設定Collections.max(collection)できるのに、int を と比較できないのはなぜCollections.max(collection)ですか?

4

2 に答える 2

5

プリミティブ型は Java コレクションに格納できません。それぞれのクラス内に自動的にボックス化されます。

を行うときはいつでもlist.add(score)score最初にオブジェクトにラップされInteger、次にコレクションに追加されます。

ここで、Collections.maxタイプのオブジェクトを呼び出す<T extends Object & Comparable<? super T>>と返され、それをプリミティブ型と比較していますが==、この演算子はオブジェクトまたは直接プリミティブ型への参照のみを比較できます。状況によっては、Listパラメトリック型が指定されていないため、コンパイラは、Integerに返されたインスタンスをボックス化解除できませんint

考えられる解決策は、

  • 戻り値を にキャストして、Integerボックス化解除を許可します
  • equalsその演算子の代わりにメソッドを使用==して、スコアが にボックス化さIntegerれ、結果と比較されるようにしますmax
于 2013-02-03T17:12:26.313 に答える
2

equals()比較のために使用してみてください:

Collections.max(collection).equals(this.score1)

このメソッドは、と比較できないオブジェクトをmax()返すことに注意してください。別のオプションは、最初に にキャストすることです。補足として、これは最大値を見つけるための最も効率的な方法ではありません。プリミティブ型とオブジェクト型を行ったり来たりしています。整数に対して独自のメソッドを実装することをお勧めします。Comparable==intIntegermax

于 2013-02-03T17:05:23.930 に答える