2015-10-03 72 views
2

我是HashSets的新手。我應該如何更改此代碼才能打印3?有沒有比hashset更好的方法?對於這個問題,比BST更適合HashSet嗎?用於查找重複陣列的HashSet

import java.util.HashSet; 
import java.util.Set; 
import java.util.ArrayList; 

public class FindDuplicates { 
    //finding duplicates in array1 and array2 using hashset and putting them into a list 
    public ArrayList<Integer> findDuplicates(ArrayList<Integer> list1, ArrayList<Integer> list2){ 
     ArrayList<Integer> duplicateList = new ArrayList<Integer>(); 
     Set<Object> listTemp=new HashSet<>(); 
     if (list1.size() < list2.size()){ 
      listTemp.add(list1); 
      for (int i=0; i<list2.size();i++){ 
       if (listTemp.contains(list2.get(i))) 
        duplicateList.add(list2.get(i)); 
      } 
     } 
     else { 
      listTemp.add(list2); 
      for (int i=0; i<list1.size();i++){ 
       if (listTemp.contains(list1.get(i))) 
        duplicateList.add(list1.get(i)); 
      } 
     } 

     return duplicateList; 
    } 

    public static void main(String argc[]){ 
     FindDuplicates fd= new FindDuplicates(); 
     ArrayList<Integer> l1=new ArrayList<Integer>(); 
     ArrayList<Integer> l2=new ArrayList<Integer>(); 
     l1.add(3); 
     l1.add(1); 
     l1.add(5); 
     l2.add(3); 
     System.out.print(fd.findDuplicates(l1, l2)); 

    } 
} 
+2

是隻由唯一編號的陣列?我的意思是,例如,一個數組可以包含兩個「ones」嗎? –

+0

好吧,這是一個很好的問題,我開始學習hashset,所以TBH對我來說不會有所不同,但是對於Set數據結構可能會有所不同嗎? –

+1

井集只能包含每個數字一次(它包含一個數字或不)。數組可以多次具有相同的數字。只有在你有[1,1]和[1,2]的情況下確定你想要返回的差異的問題只是一個例子:-)但是假設你的列表中沒有重複,Mureinik的答案很好。 –

回答

4

你可以通過使用retainAll方法大大簡化這個方法:

public ArrayList<Integer> findDuplicates 
    (ArrayList<Integer> list1, ArrayList<Integer> list2) { 

    Set<Integer> duplicates = new HashSet<>(list1); 
    duplicates.retainAll(new HashSet<>(list2)); 
    return new ArrayList<>(duplicates); 
} 
+0

如果其中一個列表明顯大於另一個,你會使用相同的方法嗎?或者相同的數據結構?我很好奇,如果BST會是更好的選擇還是設置在這種情況下? –

+1

你應該避免在'ArrayList'參數中使用'retainAll',因爲'contains'是'O(n)',導致糟糕的性能。我會爲兩者使用'HashSet'。 –

+0

@PaulBoddington那麼解決方案是什麼? –