检查一个数组中的所有元素是否都包含在另一个数组中

问题描述:

给定两个数字列表(称为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

只要找到不同的元素,就不能将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,以至于它没有真正检查第二个数组中的所有元素 –

您可以从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

一个简单的方法是将每个数组转换为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会因为使用扫描仪进行用户输入来填充每个数组而需要处理大量元素,所以拳击不应该成为问题。 –