2016-08-29 64 views
-1

我寫下面的代碼來從Arraylist中獲取重複的元素。我的aerospikePID列表沒有任何重複值,但仍然在執行下面的代碼時它正在讀取條件。如何比較Arraylist的元素<Integer>

ArrayList<Integer> aerospikePIDs = new ArrayList<Integer>();  

ArrayList<Integer> duplicates = new ArrayList<Integer>(); 
    boolean flag; 
    for(int j=0;j<aerospikePIDs.size();j++) { 
     for(int k=1;k<aerospikePIDs.size();k++) { 
      if(aerospikePIDs.get(j)==aerospikePIDs.get(k)) { 
      duplicates.add(aerospikePIDs.get(k)); 
      flag=true; 
      } 
      if(flag=true) 
System.out.println("duplicate elements for term " +searchTerm+duplicates); 
    } 
       } 

回答

2

你的內環應從j + 1(不是從1)開始,否則當j = 1(j的第二次迭代),用於k = 1(K對於j值的第一次迭代中等於1)。

aerospikePIDs.get(j)==aerospikePIDs.get(k) 

返回true

因此,代碼應該是:

ArrayList<Integer> aerospikePIDs = new ArrayList<Integer>();  

ArrayList<Integer> duplicates = new ArrayList<Integer>(); 

for (int j = 0; j < aerospikePIDs.size(); j++) { 
    for (int k = j + 1; k < aerospikePIDs.size(); k++) { 
     if (aerospikePIDs.get(j)==aerospikePIDs.get(k)) { 
      duplicates.add(aerospikePIDs.get(k)); 
      System.out.println("duplicate elements for term " +searchTerm+duplicates); 
     } 
    } 
} 

注:該標誌是沒有必要的,因爲如果你addeda複製,你可以在直接打印,如果,沒有定義新的不必要的變量和代碼。

+0

標誌是不必要的。我更新了刪除它的答案。 –

0

使用更高層次的抽象:

  1. 推送所有列表元素成Map<Integer, Integer> - 關鍵是在你的PID列表中的條目,值是一個計數器。相應的循環會簡單地檢查「鑰匙是否存在?是 - 增加計數器;否則,將計數器1添加鑰匙」。最後,您可以迭代該地圖,並且每個具有計數> 1的條目在您的列表中都有重複;你甚至可以獲得免費的重複次數。

和問題/答案,顯示你很好的方法來做這種事情......幾乎每天都張貼在這裏。例如,您可以開始here;你只需要從「字符串」鍵改爲「整數」鍵。

真的:在使用集合時,您的第一步總是:找到最高層的完成工作的方式 - 而不是坐下來編寫像剛纔那樣容易出錯的低級代碼。

0

您正在迭代使用相同的數組列表。您正在檢查內部for循環中的每個數據,確保它會顯示重複項。