2013-02-03 68 views
3

我得充滿整數列表:的Java:比較整形神祕

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 

所有給我的錯誤:

Incompatible operand types Comparable and int

然而,這似乎工作:

int highestScoreValue = Collections.max(collection); 

現在怎麼可能?

爲什麼Java允許將int設置爲Collections.max(collection),但是不允許將int與Collections.max(collection)進行比較?使用equals()用於比較

+4

'List collection = new ArrayList <>();'可能會工作。正如所聲明的,你的列表是一個'列表'...... – assylias

+0

看起來像'int highestScoreValue = Collections.max(集合);'編譯器可以使用LHS上的聲明來推斷返回類型。所以,在這種情況下,max方法返回一個'Integer'(然後自動拆箱)而不是'Comparable'。 –

+0

請勿使用原始類型。採取assylias的建議並聲明您的收藏的參數化類型。 –

回答

5

原始類型不能存儲在Java集合中,它們會自動在相應的類中進行裝箱。

無論何時你做list.add(score)score首先被包裝成一個Integer對象,然後添加到集合中。

現在,當你調用Collections.max返回<T extends Object & Comparable<? super T>>類型的obect,且將其與==比較原始的類型,但該運營商只能夠引用的對象比較,或直接原始類型,並在您的情況,因爲您的參數類型List未指定,編譯器無法取消將Integer實例返回到int

可能的解決方案是

  • 投返回值給一個Integer,因此允許取消裝箱
  • 使用equals方法而不是==操作者以便將比分盒裝到Integer,然後相對於結果max
+1

+1,以獲得書面和描述性的答案。 –

2

嘗試:

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

注意,max()方法返回一個Comparable對象,即不能與==int比較。另一種選擇是將其首先投射到Integer。作爲一個方面說明,這不是找到最大值的最有效的方法,而是在原始類型和對象類型之間來回切換。更好地實施自己的max整數方法。