2017-07-31 86 views
6

Próbuję napisać funkcję, która zwraca różnicę między dwoma tablicami. Tablice wejściowe nie są posortowane. Zakładam, że wszystkie elementy w tablicach wejściowych są unikalne. Dla przykładu:Jak znaleźć różnicę między dwiema liczbami całkowitymi?

Wejście: arr1 = [1,2,3,5,4] arr2 = [1,2,3]

oczekiwany wynik: [4,5]

Próbuję zaimplementować to przy użyciu ArrayList, ale nie może znaleźć problem z mojego kodu. Oto ona:

public class Difference{ 
ArrayList<Integer> diff(int m[],int n[]) 
    { 
     int mlen = m.length; 
     int nlen = n.length; 
     ArrayList<Integer> arr1 = new ArrayList<Integer>(Arrays.asList(m)); 
     ArrayList<Integer> arr2 = new ArrayList<Integer>(Arrays.asList(n)); 
     if(mlen>nlen) 
     { 
      arr1.removeAll(arr2); 
      return arr1; 
     } 
     else 
     { 
      arr2.removeAll(arr1); 
      return arr2; 
     } 

    } 
    public static void main(String args[]) 
    { 
      Difference obj = new Difference(); 
      int a[] = {1,2,3,4,5}; 
      int b[] = {1,2,3}; 
      System.out.println(obj.diff(a,b)); 
    } 
} 
+2

Czy zamówienie ma znaczenie? –

+1

Czy próbowałeś debugować swoją aplikację? – f1sh

+0

@JeanLogeart Czy masz na myśli kolejność na wyjściu? – coder7777

Odpowiedz

2

Problem z kodem jest to, że starają się używać non-istniejący konstruktor dla ArrayList(int[] numbers) albo trzeba dodać każdy numer od m i n do ArrayList lub użyć podwójną klamrę inicjalizacja np

ArrayList <Integer> arr1 = new ArrayList <Integer>() { 
    { 
     for (int i: m) add(i); 
    } 
} 
ArrayList <Integer> arr2 = new ArrayList <Integer>() { 
    { 
     for (int i: n) add(i); 
    } 
} 

w jednej linii będzie wyglądać następująco bez formatowania

new ArrayList<Integer>() {{for(int i:m) add(i);}};

innymi korzystnymi rozwiązaniem byłoby dodanie każdy numer podczas iteracji np

ArrayList<Integer> arr1 = new ArrayList<Integer>(); 
for(int i: m) arr1.add(i); 
0

Czy Twój kod się kompiluje?

Zgodnie z sugestią innej osoby Twoja tablica ArrayList ma typ Integer, a nie int. Oto edit:

public static void main(String args[]) 
{ 
     Difference obj = new Difference(); 
     int a[] = {1,2,3,4,5}; 
     int b[] = {1,2,3}; 
     Integer[] anew = Arrays.stream(a).boxed().toArray(Integer[]::new); 
     Integer[] bnew = Arrays.stream(b).boxed().toArray(Integer[]::new); 
     System.out.println(obj.diff(anew,bnew)); 
} 

Wreszcie, jeśli zrobić to wykorzystać, należy pamiętać, aby zmienić argumenty za diff mieć typu Integer.

+0

Tak, spełnił, ale nie uzyskał żadnego wyniku. – coder7777

0

Najprostszym rozwiązaniem jest poprzez jQuery

function array_diff(array1, array2){ 
    var diff = $(array1).not(array2).get(); 
    return diff; 
} 

console.log(array_diff([1,2,3,4,5,6], [1,2,3,4])); 
0

W przypadku ktokolwiek kończy się w tej kwestii, patrząc na odpowiedź na pytanie w tytule. Oto jeden sposób, aby to zrobić:

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

int[] uniqueEntries = IntStream.concat(IntStream.of(a), IntStream.of(b)) 
    .filter(x -> !IntStream.of(a).anyMatch(y -> y == x) || !IntStream.of(b).anyMatch(z -> z == x)) 
    .toArray(); 

System.out.println(Arrays.toString(uniqueEntries));