2017-03-23 36 views
-1

我正在嘗試創建一個集合的所有子集並將它們分組而不重複。例如,在{1,2,3,4,5,6},{(1,2),(3,4),(5,6)}這樣的集合中,這個元組可以在另一方面是有效的{ (1,2),(2,4),(5,6)}這個元組不應該是有效的,因爲它有兩個2號實例,儘管該集只有一個2號實例。如何強制eclipse創建不同的對象引用

要保證這個非重複的形式,我有一個小的方法,檢查給定的子集,如果它有作爲參數傳遞給該方法的數字,它返回true。

問題是,當像{1,2,3,1,5,6}這樣的集合中有重複時,不應該說第二個「1」等於第一個「1」。爲了做到這一點,我使用「==」運算符來比較對象引用,我希望這會使第一個「1」和第二個「1」有所不同,但它沒有。顯然,Eclipse爲在編譯時創建並具有相同值的相同類型的對象創建相同的對象引用。我如何強制Eclipse創建不同的對象引用?如果有一種方法來標記具有唯一編號的對象,這也有幫助。

這裏是方法:

private boolean doesTuplesHave(Integer number, ArrayList<ArrayList<Integer>> tuples){ 

    for(ArrayList<Integer> list : tuples){ 
     for(Integer numinTuple : list){ 
      if(numinTuple == number){ 
       return true; 
      } 
     } 
    } 

    return false; 
} 
+0

Eclipse是發展環境;它不是編譯器('javac')或運行時('jre','java') - 它是創建'Integer'實例的Java虛擬機。我可以強制你的for循環for(Integer numinTuple:list)'創建'Integer'的新單獨實例,但是numinTuple將不會'=='編號。 –

+0

除了下面的答案,你明白我,謝謝。爲了運行和測試'doesTuplesHav'方法,我創建了6個'Integer'對象,並通過將它們分組爲3來模仿tuples參數,將它們添加到2'ArrayList'中。在調試中,我發現元組中的所有整數都等於'number',而不管它們的值如何。希望我改變了設計,所以我不再需要任何參考控制。 –

回答

2

一)Eclipse有什麼關係呢,這是所有Java編譯器和JVM規範的行爲。

B)使用.equals()

if(numinTuple.equals(number)) 

,或者,如果有可能的是雙方的一個可以爲空,使用Objects.equals():

if(Objects.equals(numinTuple, number)) 

說明:在Java中,==運算符檢查引用相等性,而不是語義相等(即這是相同的對象與這些對象是否具有相同的值)

見:What is the difference between == vs equals() in Java?


另外,在Java 8,你的方法可以在一個更簡潔的方式改寫:

return tuples.stream().anyMatch(l->l.contains(number)); 

(也修復你的bug)

+0

你讓我錯了。我想檢查對象之間的引用而不是它們的值。我不想在一個元組中使用同一個對象。有一個像這樣的集合{1,2,3,4}(1,1)不是有效的,但是在像{1,2,3,1}這樣的集合中,(1,1)元組是有效的。通過控制對象的值,當給定集合爲{1,2,3,1}時,不能有(1,1)元組。問題來自這種情況。我想檢查它是否是同一個對象。但是所有具有相同值的對象的引用是相同的,所以不可能檢查引用相等。 –

相關問題