Problem beim Vergleichen zweier Arrays

Hallo liebe Experten,
Ich habe ein Problem mit einer Aufgabe aus dem Studium. Die Aufgabe ist ein Programm zu schreiben, dass zuerst die Länge zweier Arrays von der Tastatur einliest, dann die einzelnen Werte eingegeben werden können und zum Schluss sollen diese Arrays miteinander verglichen werden und als Ausgabe soll erscheinen „Paar vorhanden“ oder „Paar nicht vorhanden“. Als Werte für die Arrays sollen ganze Zahlen eingegben werden.

Hier mein erster Ansatz, der allerdings immer nur „Paar nicht vorhanden“ ausgibt, wenn die beiden Arrays nicht identisch sind:
import java.io.*;
public class Vergleich {

public static void main(String args[]) throws IOException {

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

System.out.println(„Bitte Länge des Arrays angeben:“);
int n = Integer.parseInt(in.readLine());

int[] b = new int[n];

int[] c = new int[n];

System.out.println();
System.out.println(„Bitte Werte fuer a-Komponenten eingeben:“);
for (int i=0; i-1){
System.out.println(„Paar vorhanden!“);
}
if(d==-1) {
System.out.print(„Paar nicht vorhanden!“);
}

}
}

Vorab schonmal vielen Dank für die Bemühungen!

Hi,

ich habs jetzt nur kurz überflogen aber wies aussieht überschreibst du die Variable d bei jeden Durchlauf d.h. dass anscheinend immer das letzte Element ungleich ist und du daher immer „kein Paar vorhanden“ bekommst.(übrigens sind die Namen deiner Variablen grauenhaft…)

Wenn du wissen willst ob es irgend ein Paar gibt musst du direkt aus beiden (!) Schleifen ausbrechen / musst sie beenden oder d einfach hochzählen bspw per d++;. Wenn d > 0 hast du ein Paar wenn nicht, dann nicht.

Mit letzterem hättest du auch schon indirekt die Möglicheit auszugeben wie viele Paare es gibt.

kurz ausm Kopf:

int anzPaare; // ein int kann nicht null sein Default ist immer 0
for(int i = 0; i0)
System.out.println(„Paar vorhanden“);
else
System.out.println(„Kein Paar vorhanden“);

Hoffe ich konnte dir helfen

Gruß

Hallo Kardnic,

ich habe eventuell den Fehler in deinem Codestück gefunden. Schau dir diesen Ausschnitt nochmal an:

int d=0;
for (int i = 0; i -1){
System.out.println(„Paar vorhanden!“);
}
if(d==-1) {
System.out.print(„Paar nicht vorhanden!“);

Du setzt deine Variable d immer neu für jedes Paar, das du vergleichst. Allerdings gibst du das Ergebnis nicht aus, sondern speicherst es eben in der Variable, die du beim nächsten Paar wieder überschreibst! Am Ende machst du eine Ausgabe auf Basis des Inhalts der Variable d. In der Variable d steht dann logischerweise immer das Ergebnis des letzten Vergleichs - die anderen Vergleichsergebnisse, die in d standen, sind ja immer wieder überschrieben worden.

Es gibt jetzt zwei Möglichkeiten:
a) Du ziehst die if-Blöcke mit den Ausgaben mit in die innere Schleife, sodass du für jeden Vergleich direkt eine Ausgabe hast (dann könntest du dir aber auch das d sparen und statt 4 if’s bloß 2 if’s machen).
b) Wenn du nur wissen willst, ob mindestens ein Paar, das du verglichen hast, gleich war, dann machst du aus

if (b[i] != c[j]) {
d= -1;
}

besser eher das

if (b[i] != c[j] && d != 1) {
d= -1;
}

Allerdings ist mir deine Aufgabenstellung nicht völlig klar. Dein Code liest eine Arraylänge und dann die einzelnen Felder für beide Arrays ein. Anschließend vergleicht dein Code im Moment jedes Element aus Array b mit jedem Element aus Array c. D.h. dass dein Code am Ende n^2 viele Vergleiche macht und bei meinem Lösungsvorschlag a) dann entsprechend auch n^2 viele Ausgaben machen wird. Ist das auch das, was du machen willst/sollst?

Noch ein Tipp zum Vorgehen bei der eigenen Fehlersuche: versuche wie ein Computer zu denken: ein Schritt nach dem anderen. Oftmals fällt dir schon im zweiten oder dritten Schleifendurchlauf auf, wo der Fehler liegt - ist also gar kein großer Aufwand, vielleicht 5 Minuten wenn du es dir aufschreibst.

Viel Spaß noch beim Programmieren und viel Erfolg im Studium.

Liebe Grüße,
BigBob

Hallo Kardnic,

ich habe noch nicht genau verstanden, wie Du die Arrays vergleichen sollst. (Sollen die Arrays Element für Element gleich sein? Oder reicht es, wenn sie die gleichen Zahlen enthalten, die Reihenfolge aber verschieden sein kann?)

Da Deine Lösung die Variable d bei jedem Schleifendurchlauf überschreibt, enthält sie am Schluss nur den Wert der Berechnung für i=n-1 und j=n-1 – Du vergleichst also effektiv genau nur jeweils die letzten Elemente.

Hilft Dir der Tip schon weiter? Wenn Du ansonsten weitere Hilfe bei der Implementierung brauchst, musst Du die Anforderung noch einmal genau erklären! :wink:

Schöne Grüße,

Manfred

Hi,

ich glaube nicht, dass die Methode IMMER „Paar nicht gefunden zurueck gibt“, oder hast Du es schon mal mit zwei komplett gleichen Arrays probiert?

Falls d=1 gesetzt wird, sollte man aus den Schleifen mit break hinausgehen. Hier mein Verbesserungsvorschlag fuer den unteren teil (keine Garantie):

boolean d=false;
outer:
for (int i = 0; i

Hallo Kardnic,

leider bin ich nur Interessierter. Ich habe mein Profil schon seit längerem auf „nicht für Fragen auswählen“ gestellt - das scheint den Verteiler wohl nicht zu interessieren. Aber ich glaube eine Lösung Für Dein Problems gefunden zu haben :

Zunächst einmal sollte es wohl beim zweiten Mal „b-Komponenten“ heißen und nicht zweimal „a-Komponenten“.

Dein Programm gibt immer „Paar nicht vorhanden“ aus, außer die jeweils letzten beiden Werte sind identisch (probier’s aus)

Es wäre besser, wenn Du nur eine Abfrage machst, nämlich ob „Paar vorhanden“ ist. Dann wird d=1 gesetzt. Jetzt darfst Du den Wert für d aber nicht mehr ändern, was Du allerdings mit Abfrage und Setzen auf d=-1 bei „ungleich“ gemacht hast. Hier liegt der Fehler. Lass die folgenden Zeile weg, und es funktioniert :

if (b[i] != c[j]) {
d= -1;
}

if(d==-1) {
System.out.print(„Paar nicht vorhanden!“);
}

bzw. setzt das letzte System.out als „else“-Zweig ein

Mit Gruß,
Frank-Thomas

Hallo,

was heisst bei dir denn Paar?
soll geprüft werden ob irgendwo in den Arrays 2 mal die gleiche zahl steht, oder soll geprüft werden ob die an der gleichen stelle stehen?

lg