2017-03-02 71 views
1

給定兩個數字列表(稱爲listA和listB),我需要編寫一個Java方法 ,它返回一個布爾值來指明 listA中的所有元素包含在listB中。檢查一個數組中的所有元素是否都包含在另一個數組中

我不能完全讓我的代碼工作,因爲它似乎總是返回false。

public static boolean containsAll(int[] listA, int[] listB) 
    { 
     boolean containsAll = true; 
     int ctr1 = 0, ctr2 = 0; 

     while(ctr1 < listA.length && containsAll) 
     { 
      ctr2 = 0; 
      while(ctr2<listB.length && containsAll) 
      { 
       if(listA[ctr1] != listB[ctr2]) 
        containsAll = false; 
       ctr2++; 
      } 
      ctr1++; 
     } 
     return containsAll; 
    } 

    public static void testContainsAll() 
    { 
     Scanner input1 = new Scanner(System.in); 
     System.out.println("Enter size of first array"); 
     int array1[] = new int[input1.nextInt()]; 

     System.out.println("Enter number of ints required"); 
     for(int i=0; i<array1.length; i++) 
     { 
      array1[i] = input1.nextInt(); 
     } 

     Scanner input2 = new Scanner(System.in); 
     System.out.println("Enter size of second array"); 
     int array2[] = new int[input2.nextInt()]; 

     System.out.println("Enter number of ints required"); 
     for(int i=0; i<array2.length; i++) 
     { 
      array2[i] = input2.nextInt(); 
     } 

     boolean containsAll = containsAll(array1,array2); 
     if(containsAll == true) 
      System.out.print("listB contains all elements of listA"); 
     else 
      System.out.print("listB doesn't contain all elements of listA"); 
    } 
+1

您是否已經在調試器中逐步瞭解代碼?你發現了什麼? –

+0

您可以簡單地將每個數組轉換爲HashSet並檢查它們的交集。 –

+0

@JacobG。不簡單。 – shmosel

回答

-1

只要找到不同的元素,就不能將containsAll設置爲false。只有在元素匹配時纔是錯誤的,直到內部循環完成後纔會知道。這裏有一個簡單的實現:

public static boolean containsAll(int[] listA, int[] listB) { 
    outer: 
    for (int a : listA) { 
     for (int b : listB) { 
      if (a == b) { 
       continue outer; 
      } 
     } 
     return false; 
    } 
    return true; 
} 

或者,如果你不喜歡的goto:

public static boolean containsAll(int[] listA, int[] listB) { 
    for (int a : listA) { 
     if (!contains(listB, a)) { 
      return false; 
     } 
    } 
    return true; 
} 

private static boolean contains(int[] list, int i) { 
    for (int e : list) { 
     if (e == i) { 
      return true; 
     } 
    } 
    return false; 
} 
+0

謝謝shmosel沒有意識到我在內部循環中設置containsAll爲false,以至於它沒有真正檢查第二個數組中的所有元素 –

0

您可以從INT []初始化一個HashSet,然後通過調用containsAll

檢查數組包含的所有元素
public static boolean containsAll(int[] listA, int[] listB){ 
     Set<Integer> a = Arrays.stream(listA).boxed().collect(Collectors.toSet()); 
     Set<Integer> b = Arrays.stream(listB).boxed().collect(Collectors.toSet()); 
     return a.containsAll(b); 
     } 
+0

您不能在'Arrays.asList()中包裝基本數組' 。 – shmosel

+0

你是對的,不得不裝箱整數。 –

+0

你爲什麼要收集到一個列表,然後複製到一個集? – shmosel

-1

一個簡單的方法是將每個數組轉換爲Set,然後使用Set#retainAll來確定相等性。

int[] a = {1, 2, 3, 4, 5}; 
int[] b = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

Set<Integer> A = Arrays.stream(a).boxed().collect(Collectors.toSet()); 
Set<Integer> B = Arrays.stream(b).boxed().collect(Collectors.toSet()); 

System.out.println(B.containsAll(A)); 

這將打印true如果所述的每個元素是在B,否則false

感謝shmosel推薦Set#containsAll

+0

對臨時收藏的拳擊似乎對我有點過分。順便說一句,你可以調用'containsAll()'。 – shmosel

+0

確實,'containsAll()'會更簡單。我將編輯我的帖子。但是我不認爲OP會因爲使用掃描儀進行用戶輸入來填充每個數組而需要處理大量元素,所以拳擊不應該成爲問題。 –

相關問題