zwei String Arrays miteinander vergleichen

JavaKev

Mitglied
Hallo, ich habe folgende Aufgabe bekommen: Schreiben Sie eine Methode calcIntersection, welche zwei Arrays von Strings als Parameter erhält. Das erste Array enthält Namen (bspw. von Teilnehmenden eines Konzertes), das zweite Array ebenfalls Namen (bspw. von Personen die im Fanshop bestellt haben). Geben Sie ein String-Array zurück, mit allen Namen in der Reihenfolge wie im ersten Array, die in beiden Listen vorkommen (bspw. weil diese Personen einen Rabatt erhalten würden). Sollte es keine Übereinstimmungen geben, geben Sie ein leeres Array zurück.

Nun habe ich folgenden Code geschrieben:
Java:
public static String[] calcIntersection(String[] participants, String[] shopCustomers){
        int counter = 0;
        String[] neuerString = new String[counter];
        if (participants.length == 0 || shopCustomers.length == 0) return new String[0];
        for (int i = 0; i < participants.length; i++) {
            for (int j = 0; j < shopCustomers.length; j++) {
                if (participants[i].equals(shopCustomers[j])) {
                    counter++;
                    neuerString[i] = participants[i];
                } else {
                    continue;
                }
            }
        }
        return neuerString;
    
    }
ich habe hier nun das Problem, dass ich eine ArrayOutOfBoundsException bekomme. Kann mir vielleicht jemand helfen?
Die Beispiele die ich ausprobiert habe sind:
Code:
System.out.println(Arrays.deepToString(calcIntersection(new String[] {}, new String[] {})));

System.out.println(Arrays.deepToString(calcIntersection(new String[] { "Leonie", "Christian" }, new String[] { "Emir", "Leonie" })));

System.out.println(Arrays.deepToString(calcIntersection(new String[] { "Leonie", "Christian", "Tamara", "Sophie", "Ben", "Emre" }, new String[] { "Ben", "Aurelie", "Tamara" })));
 
Dein Array neuerString hat immer Platz für 0 Elemente.
counter++ erweitert nicht den Platz des Arrays.

Bei einem Array kann der Platz später gar nicht erweitert werden.
Dies würde mit ArrayLists funktionieren. Darfst du ArrayLists verwenden?
 
Was du machen könntest, ist ein array mit 100 Stellen zu instanzieren und dann am ende diese zu "kürzen" 🙂
Java:
String[] neueListe = new String[100];
....
....
neueListe = Arrays.copyOf(neueListe, counter);
 
Dein Array neuerString hat immer Platz für 0 Elemente.
counter++ erweitert nicht den Platz des Arrays.

Bei einem Array kann der Platz später gar nicht erweitert werden.
Dies würde mit ArrayLists funktionieren. Darfst du ArrayLists verwenden?
Hallo, ArrayLists darf ich leider nicht verwenden. Ich weiß leider nicht wie groß ich das Array machen soll, da ja immer unterschiedlich viele Elemente in dem Array sein können.
 
Hallo, ArrayLists darf ich leider nicht verwenden. Ich weiß leider nicht wie groß ich das Array machen soll, da ja immer unterschiedlich viele Elemente in dem Array sein können.
Das Ergebnis kann ja maximal so groß sein, wie das erste Array, oder? Nämlich, wenn alle Elemente des ersten Arrays im zweiten vorkommen. Davon würde ich ausgehen.
 
Das Ergebnis kann ja maximal so groß sein, wie das erste Array, oder? Nämlich, wenn alle Elemente des ersten Arrays im zweiten vorkommen. Davon würde ich ausgehen.
wenn ich das Array aber so groß mache wie das participants dann kommt als Ergebnis [null, null, Tamara, null, Ben, null] aber möchte ja nur das als Ergebnis [Tamara, Ben] rauskommt.
 
Was du machen könntest, ist ein array mit 100 Stellen zu instanzieren und dann am ende diese zu "kürzen" 🙂
Java:
String[] neueListe = new String[100];
....
....
neueListe = Arrays.copyOf(neueListe, counter);
wo muss das kürzen denn stehen, weil wenn ich es vor dem return stetze, dann kommt als Ergebnis beim dritten Beispiel [null, null] raus ?
 
wenn ich das Array aber so groß mache wie das participants dann kommt als Ergebnis [null, null, Tamara, null, Ben, null] aber möchte ja nur das als Ergebnis [Tamara, Ben] rauskommt.
Der Inhalt sollte unmittelbar nach dem Vergleich so aussehen: [Tamara, Ben, null, null, null, null].

Das geht z.B. ungefähr so:
Java:
if (participants[i].equals(shopCustomers[j])) {
    neuerString[counter] = participants[i];
    counter++;
}

Anschließend kannst du es kürzen, siehe Beitrag von @Kirby_Sike.

Der Name "neuerString" ist übrigens schlecht gewählt. Es ist schließlich ein Array von Strings und kein String. Besser wäre z.B. "tempResults"
 
Der Inhalt sollte unmittelbar nach dem Vergleich so aussehen: [Tamara, Ben, null, null, null, null].

Das geht z.B. ungefähr so:
Java:
if (participants[i].equals(shopCustomers[j])) {
    neuerString[counter] = participants[i];
    counter++;
}

Anschließend kannst du es kürzen, siehe Beitrag von @Kirby_Sike,
okay, hier bekomme ich aber als Ergebnis [null,null] raus. Bedeutet das, dass ich die Elemente noch sortieren muss?
 
Ich denke, was du von Anfang an programmieren wolltest, ist das:
Java:
import java.util.Arrays;

public class Hauptprogramm {

    public static void main(String[] args) {
        System.out.println(Arrays.deepToString(calcIntersection(new String[] {}, new String[] {})));

        System.out.println(Arrays.deepToString(calcIntersection(new String[] { "Leonie", "Christian" }, new String[] { "Emir", "Leonie" })));

        System.out.println(Arrays.deepToString(calcIntersection(new String[] { "Leonie", "Christian", "Tamara", "Sophie", "Ben", "Emre" }, new String[] { "Ben", "Aurelie", "Tamara" })));
    }

    public static String[] calcIntersection(String[] participants, String[] shopCustomers) {
        int counter = 0;
        if (participants.length == 0 || shopCustomers.length == 0)
            return new String[0];
        for (int i = 0; i < participants.length; i++) {
            for (int j = 0; j < shopCustomers.length; j++) {
                if (participants[i].equals(shopCustomers[j])) {
                    counter++;
                } else {
                    continue;
                }
            }
        }
        String[] neuerString = new String[counter];
        int k = 0;
        for (int i = 0; i < participants.length; i++) {
            for (int j = 0; j < shopCustomers.length; j++) {
                if (participants[i].equals(shopCustomers[j])) {
                    neuerString[k] = participants[i];
                    k++;
                } else {
                    continue;
                }
            }
        }
        return neuerString;
    }

}
Ausgabe:
Code:
[]
[Leonie]
[Tamara, Ben]
 
Wie sieht denn der komplette Code aus?
Java:
public static String[] calcIntersection(String[] participants, String[] shopCustomers){
        String[] neuerString = new String[participants.length];
        int counter = 0;
        if (participants.length == 0 || shopCustomers.length == 0) return new String[0];
        for (int i = 0; i < participants.length; i++) {
            for (int j = 0; j < shopCustomers.length; j++) {
                if (participants[i].equals(shopCustomers[j])) {
                    counter++;
                    neuerString[i] = participants[i];
                } else {
                    continue;
                }
            }
        }
        neuerString = Arrays.copyOf(neuerString, counter);
        return neuerString;
    
    }
 
Ich denke, was du von Anfang an programmieren wolltest, ist das
Ich denke, dass hätte er auch selbst geschafft, ohne dass man ihm den kompletten Code liefert 😕

Was ich damit sagen will ist: Man muss nicht immer zeigen, dass man es voll drauf hat, sondern kann dem Gegenüber auch die Möglichkeit geben aus eigenen Fehlern zu lernen. So, das war das Wort zum Sonntag.
 
Zuletzt bearbeitet:
Java:
public static String[] calcIntersection(String[] participants, String[] shopCustomers){
        String[] neuerString = new String[participants.length];
        int counter = 0;
        if (participants.length == 0 || shopCustomers.length == 0) return new String[0];
        for (int i = 0; i < participants.length; i++) {
            for (int j = 0; j < shopCustomers.length; j++) {
                if (participants[i].equals(shopCustomers[j])) {
                    counter++;
                    neuerString[i] = participants[i];
                } else {
                    continue;
                }
            }
        }
        neuerString = Arrays.copyOf(neuerString, counter);
        return neuerString;
  
    }

Der Inhalt sollte unmittelbar nach dem Vergleich so aussehen: [Tamara, Ben, null, null, null, null].

Du darfst die gefundene Übereinstimmung ja nicht an der Stelle der Übereinstimmung zuweisen, sondern an die erste Position des noch leeren Arrays. Siehe hier neuerString[i] = participants[i]; Du findest das Wort an der Position i " und speicherst es an der Position i.
 
Zuletzt bearbeitet:
Ach, und noch was: Der else-Zweig ist überflüssig. Da sowieso keine Anweisungen mehr folgen, wird die Schleife so oder so mit dem nächsten Durchlauf beginnen.
 

Zurück
Oben