web-dev-qa-db-de.com

Java, Schnittpunkt zweier Arrays

Ich habe bereits ein paar andere Stack-Überlauf-Threads dazu gelesen:

um die Schnittmenge zweier Multisets in Java zu finden

Wie bekomme ich die Kreuzung zwischen zwei Arrays als neues Array?

public static int[] intersection (int [] x, int numELementsInX, int [] y, int numElementsInY) {

Ich versuche, zwei Arrays sowie deren Anzahl von Elementen (numElementsInX und numElementsInY) zu untersuchen und ein neues Array zurückzugeben, das die allgemeinen Werte von Array x und y enthält. Ihre Kreuzung.

Example,if x is{1,3,5,7,9}and y is{9,3,9,4} then
intersection(x, 5, y, 4} should return {3, 9} or {9, 3}

Ich habe gelesen, dass ich den LCS-Algorithmus verwenden muss. Kann mir jemand ein Beispiel geben, wie das geht? Sowohl das Array als auch die Werte im Array werden initialisiert und in einer anderen Methode generiert und dann an die Schnittmenge übergeben.

Jede Hilfe/Klarstellung wird geschätzt.

CODE BEARBEITEN

for (int i=0; i<numElementsInX; i++){
    for (int j=0; j<numElementsInY; j++){
        if (x[j]==x[i]) { //how to Push to new array?; 
        }
        else{
        }
    }
}
23
andrsnn

Die einfachste Lösung wäre, Sets zu verwenden, solange Sie nicht darauf achten, dass die Elemente im Ergebnis eine andere Reihenfolge haben und Duplikate entfernt werden. Die Eingabearrays array1 und array2 sind die Integer[]-Subarrays der angegebenen int[]-Arrays, die der Anzahl der Elemente entsprechen, die Sie verarbeiten möchten:

Set<Integer> s1 = new HashSet<Integer>(Arrays.asList(array1));
Set<Integer> s2 = new HashSet<Integer>(Arrays.asList(array2));
s1.retainAll(s2);

Integer[] result = s1.toArray(new Integer[s1.size()]);

Das Obige wird einen Integer[] zurückgeben, bei Bedarf ist es einfach, den Inhalt zu kopieren und in einen int[] umzuwandeln.

44
Óscar López

Wenn Sie mit Java-8 zufrieden sind, dann ist die einfachste Lösung, die ich mir vorstellen kann, Streams und Filter. Eine Implementierung sieht wie folgt aus:

public static int[] intersection(int[] a, int[] b) {
    return Arrays.stream(a)
                 .distinct()
                 .filter(x -> Arrays.stream(b).anyMatch(y -> y == x))
                 .toArray();
}
13
Bilesh Ganguly

Wenn Sie keine anderen Datenstrukturen wie ein Set verwenden möchten, besteht die grundlegende Idee darin, dass Sie die Elemente eines der Arrays durchlaufen und für jeden Wert prüfen, ob er im anderen Array erscheint. Wie sehen Sie, ob es im anderen Array erscheint? Gehen Sie durch die Elemente des anderen Arrays, und prüfen Sie, ob der Wert mit dem Wert übereinstimmt, den Sie suchen. Ich vermute, dass Sie sich am besten damit auskennen können, wenn Sie versuchen, dieses Problem über diesen Punkt hinaus selbst zu lösen, wenn Sie an dem Kurs lernen möchten, gut Java zu schreiben, aber wenn Sie nicht weiter wissen, können Sie Ihre Frage mit dem Code aktualisieren dass Sie geschrieben haben, um detaillierteres Feedback und Hinweise in die richtige Richtung zu erhalten.

2
tuckermi

Mit doppelten Elementen in der Schnittpunktsuche. 

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

    Arrays.sort(arr1);
    Arrays.sort(arr2);
    ArrayList result = new ArrayList<>();
    int i =0 ;
    int j =0;
    while(i< arr1.length && j<arr2.length){
    if (arr1[i]>arr2[j]){
        j++;

    }else if (arr1[i]<arr2[j]){
        i++;

    }else {
        result.add(arr1[i]);
        i++;
        j++;
    }
    }
    System.out.println(result);
1
Mahesh Naik

Versuche dies:

public static void main(String[] args) {
    int[] arr1 = new int[]{1, 2, 3, 4, 5};
    int[] arr2 = new int[]{3, 2, 5, 9, 11};
    getIntersection(arr1, arr2);
}

public static Object[] getIntersection(int[] arr1, int[] arr2) {
    List<Integer> list = new ArrayList<Integer>();
    for (int i = 0; i < arr1.length; i++) {
        for (int j = 0; j < arr2.length; j++) {
            if (arr1[i] == arr2[j]) {
                list.add(arr1[i]);
            }
        }
    }
    return list.toArray();
}

wenn die Arrays sortiert sind

    int a1[]=new int[] {1,2,3,5,7,8};
    int a2[]=new int [] {1,5,6,7,8,9};

     // get the length of both the array
    int n1=a1.length;
    int n2=a2.length;

 //create a new array to store the intersection
   int a3[]=new int[n1];

     //run the loop and find the intersection
    int i=0,j=0,k=0;
    while(i<n1&& j<n2) {
        if(a1[i]<a2[j]) {
         // a1 element at i are smaller than a2 element at j so increment  i
            i++;
        }else if(a1[i]>a2[j]) {
         // a2 element at i are smaller than a2 element at j so increment  j

            j++;
        }else {
             // intersection element store the value and increment i, j, k    to find the next element
            a3[k]=a1[i];
            i++;
            j++;
            k++;
        }
    }


    for(int l=0;l<a3.length;l++) {
        System.out.println(a3[l]);
    }
0
Sonia Jain

Wenn Sie dies jemals in Python implementieren wollten, können Sie auf diese Weise einen Schnittpunkt finden.

#find intersection
def find_intersec(list_a, list_b): 
    return set(list_a).intersection(list_b) 

#since lists are kind of like arrays in python we use two lists
list_a = [ 4, 9, 1, 17, 11, 26, 28, 10,28, 26, 66, 91] 
list_b = [9, 9, 74, 21, 45, 11, 63,10] 
print(find_intersec(list_a, list_b)) 
0
grepit

So finden Sie den Schnittpunkt von 3 unsortierten Arrays in Java: -

Ich habe den Core-Java-Ansatz mit for-Schleifen und Arrays.copyOf verwendet.

public class Intersection {
    public void intersection3Arrays(int ar1[], int ar2[], int ar3[]) {
            Arrays. sort(ar1);
            Arrays. sort(ar2);
            Arrays. sort(ar3);

            int ar1Len = ar1.length;
            int ar2Len = ar2.length;
            int ar3Len = ar3.length;

            int larArray = ar3Len > (ar1Len > ar2Len ? ar1Len : ar2Len) ? ar3Len : ((ar1Len > ar2Len) ? ar1Len : ar2Len);
            System.out.println("The largest array is " +larArray);
            int[] inputArray1 = Arrays.copyOf(ar1, larArray);
            int[] inputArray2 = Arrays.copyOf(ar2, larArray);
            int[] inputArray3 = Arrays.copyOf(ar3, larArray);

            Integer[] inputArray11 = new Integer[inputArray1.length];
            Integer[] inputArray22 = new Integer[inputArray2.length];
            Integer[] inputArray33 = new Integer[inputArray3.length];

            for (int i = 0; i < inputArray11.length; i++) {
                if (inputArray11[i] == null){
                    inputArray1[i] = 0;
                }
            }
            for (int i = 0; i < inputArray22.length; i++) {
                if (inputArray22[i] == null){
                    inputArray1[i] = 0;
                }
            }
            for (int i = 0; i < inputArray33.length; i++) {
                if (inputArray33[i] == null){
                    inputArray1[i] = 0;
                }
            }

            for (int i = 0; i < inputArray11.length; i++)
                for (int j = 0; j < inputArray22.length; j++)
                    for (int k = 0; k < inputArray33.length; j++)
                    if (inputArray11[i] == inputArray22[j] && inputArray11[i] == inputArray33[k]) {
                        System.out.print(inputArray11[i]+" ");
                    }
        } 
    public static void main(String[] args) {
        Intersection3Arrays arrays = new Intersection3Arrays();
        int ar1[] = { 1, 2, 5, 10, 20, 40, 80 };
        int ar2[] = { 80, 100, 6, 2, 7, 20 };
        int ar3[] = {3, 4, 15, 20, 30, 70, 80, 120}; 
        arrays.intersection3Arrays(ar1, ar2, ar3);
    }
}
0
Kapil Sharma
if the arrays are not sorted


    int a1[]=new int[] {1,2,3,5,7,8};
    int a2[]=new int [] {1,5,6,7,8,9};
 // sort both the array
     Arrays.sort(a1);
     Arrays.sort(a2);
     // get the length of both the array
    int n1=a1.length;
    int n2=a2.length;

 //create a new array to store the intersection
   int a3[]=new int[n1];

     //run the loop and find the intersection
    int i=0,j=0,k=0;
    while(i<n1&& j<n2) {
        if(a1[i]<a2[j]) {
         // a1 element at i are smaller than a2 element at j so increment  i
            i++;
        }else if(a1[i]>a2[j]) {
         // a2 element at i are smaller than a2 element at j so increment  j

            j++;
        }else {
             // intersection element store the value and increment i, j, k    to find the next element
            a3[k]=a1[i];
            i++;
            j++;
            k++;
        }
    }


    for(int l=0;l<a3.length;l++) {
        System.out.println(a3[l]);
    }
0
Sonia Jain

die Suche nach einer Kreuzung enthält ein Duplikat unter Verwendung der Hash-Karte. 

Ausgabe: 1 2 2 15 9 7 12

public static void main(String[] args) {
    int[] arr1 = {1, 2, 2, 1, 5, 9, 15, 9, 7, 7, 12};
    int[] arr2 = {1, 2, 2, 3, 4, 15, 9, 7, 12, 14};
    printIntersect(arr1, arr2);
}

private static void printIntersect(int[] arr1, int[] arr2) {
    Map<Integer, Integer> map = new HashMap<>();
    //put first array to map
    for (int i = 0; i < arr1.length; i++) {
        if (!map.containsKey(arr1[i])) {
            map.put(arr1[i], 1);
        } else {
            map.put(arr1[i], map.get(arr1[i]) + 1);
        }
    }

    //check all value in array two
    for (int i = 0; i < arr2.length; i++) {
        //if exist and value>1  then decrement value
        //if value is 1 remove from map
        if (map.containsKey(arr2[i])) {
            System.out.print(arr2[i] + " ");
            if (map.get(arr2[i]) > 1) {
                map.put(arr2[i], map.get(arr2[i]) - 1);
            } else {
                map.remove(arr2[i]);
            }
        }
    }
}
0
ikarayel