2016-12-01 55 views
3

我試圖打印2陣列A和B之間的非交集。但是,我有一個問題如何在不同的B.上打印元素。 這是我的示例代碼:查找2個陣列的不同元素

public class Array { 

    public static void main(String[] args) { 
     for (int i = 0; i <= arrA.length - 1; i++) { 
      arrA[i] = sc.nextInt(); 
     } 
     for (int i = 0; i <= arrB.length - 1; i++) { 
      arrB[i] = sc.nextInt(); 
     } 

     boolean x = true; 
     int y = 0; 
     for (int i = 0; i < arrA.length; i++) { 
      for (int j = 0; j < arrB.length; j++) { 
       if (arrA[i] == arrB[j]) { 
        arrTestA[i] = true; 
       }else y = arrA[i]; 
      } 
     } 

     for (int i = 0; i < arrA.length; i++) { 
      x = x && arrTestA[i]; 
     } 

     if (x) { 
      System.out.println("All the elements of A contained in B."); 
     }else { 
      System.out.println("There are elements on A different B."); 
      System.out.println("The elements of A which is not in B = "); //My Problem 
     } 

    } 
} 
+1

的[兩個陣列之間的差異(可能的複製http://stackoverflow.com/questions/13732312 /兩個數組之間的差異) – Berger

+0

謝謝。我認爲這沒有問題。問題是我如何得到「不在B = 4中的A的元素」 –

回答

4

爲了實現這個目標,你可以使用CollectionsretainAll方法。 如:

List<Integer> arrTestA = new ArrayList<>(); 
List<Integer> arrTestB = new ArrayList<>(); 

[...] 

List<Integer> common = new ArrayList<>(arrTestA); 
common.retainAll(arrTestB); 

List<Integer> diff = new ArrayList<>(); 
for(Integer element : arrTestA) 
    if(!common.contains(element)) 
     diff.add(element); 

[here you print out elements of diff as The elements of A which is not in B] 

ETA:非集合嘗試:

int[] arr1 = { 1, 11, 5, 9, 4, 3, 4, 8 }; 
int[] arr2 = { 1, 7, 5, 3, 4, 8 }; 

Arrays.sort(arr1); 
Arrays.sort(arr2); 

for (int i : arr1) { 
    boolean contains = false; 
    for (int j : arr2) { 
     if (i == j) { 
      contains = true; 
      break; 
     } 
    } 
    if (!contains) 
     System.out.println("Arr2 doesn't contain number: " + i); 
} 

...或環可以是這樣的:

outer: for (int i : arr1) { 
    for (int j : arr2) { 
     if (i == j) { 
      continue outer; 
     } 
    } 
    System.out.println("Arr2 doesn't contain number: " + i); 
} 

這是隻有一條路方法,但希望你明白這一點。

ETA2: 在我的方法中,事實上,這些數組不必排序。您可以簡單地刪除負責排序的代碼行。

+0

謝謝。如果我不使用數組列表,集合和retainAll。我只是想使用像選擇和循環這樣的控制結構,如果對於 –

+0

@MarkMartin完成。一探究竟。 – null

+0

謝謝。如果代碼不再使用像Arrays.sort()這樣的方法。該算法僅使用選擇和循環。 @ user629735 –

1

這個想法是對兩個數組進行排序並通過它們。通過對它們進行排序,你不會有交叉檢查的所有元素

int[] arr1 = {1,3,5,6,7,4,8}; 
    int[] arr2 = {1,2,5,6,9,4,8}; 

    Arrays.sort(arr1); 
    Arrays.sort(arr2); 
    int j =0; 
    for(int i = 0; i < arr1.length; i++){ 
     while(j < arr2.length && arr2[j] < arr1[i]){ 
      System.out.println("number: " +arr2[j]); 
      j++; 
     } 

     if(arr2[j] != arr1[i]){ 
      System.out.println("number: " +arr1[i]); 
     }else{ 
      j++; 
     } 
    } 
3

您可以使用設置(它需要額外的空間來存儲它的元素,但代碼很簡單):

Integer[] a = {0, 1, 2}; 
Integer[] b = {1, 2, 3}; 
Set<Integer> setFromA = new HashSet<>(Arrays.asList(a)); 
for (int num : b) { 
    if (!setFromA.contains(num)) { 
     System.out.println(num); 
    } 
} 

同樣使用Java 8個流API:

Arrays.stream(b).filter(num -> !setFromA.contains(num)).forEach(System.out::println); 

此外,還可以保存結果到一個新的列表(如果你願意的話):

List<Integer> result = Arrays.stream(b) 
     .filter(num -> !setFromA.contains(num)) 
     .collect(Collectors.toList()); 
1

我不建議在這裏使用列表,因爲包含時間複雜度爲o(n)
使用設置爲包含需要一定的時間(如果你想維持秩序也,去LinkedHashSet)

// store array b into a set 
Set<Integer> setInts = new HashSet<>(Arrays.asList(B); 

// traverse array a, and check if set contains currrent element 
for(int e : A) 
{ 
    if(!setInts.contains(e)) 
    System.out.println(e); 
}