2017-03-02 4 views
1

数字の2つのリスト(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; 
} 

それとも、GOTOSを嫌う場合:

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はinnerループのcontainsAllをfalseに設定していたので、2番目の配列のすべての要素に対して実際にチェックしていませんでした。 –

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

あなたは正しいです、ボックスにintを持っていた。 –

+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)); 

A内のすべての要素がBである場合、これはそうでなければfalsetrueを印刷します。

お勧めのshmoselのおかげでSet#containsAll

+0

一時的なコレクションへのボクシングは私に少し過度のようです。あなたは単に 'containsAll()'を呼び出すことができます。 – shmosel

+0

trueの場合、 'containsAll()'は簡単になります。私は自分の投稿を編集します。しかし、私はOPがユーザー入力のためにスキャナーを使用して各アレイにデータを書き込むために大量の要素を処理しなければならないと考えているので、ボクシングは問題ではありません。 –

関連する問題