Elemente von 2 Arrays vergleichen

1207

Aktives Mitglied
Hallo,
ich soll ich eine Methode static boolean arraysAreEqual( char[] firstArray, char[] secondArray ) erstellen, die genau dann true zurückgibt, wenn zwei Arrays aus Zeichen identisch sind.
Ich habe das jetzt mal so ausprobiert:
Java:
static boolean arraysAreEqual(char[]firstArray, char[]secondArray) { 
	
	for( int i = 0; i < secondArray.length; i++)
	
	     if(firstArray[i] != secondArray[i])
		    continue;
		 
		     else 
		     {return true;
		     }
			 
		return false;
		 }

und meine main-Methode sieht so aus:
Java:
 public static void main(String[] args) {
      char[] firstArray = new char[] { 'a', 'b', 'c', 'd'};
	  char[] secondArray = new char[] {'k', 'u', 'a', 'm'};
	  System.out.println(arraysAreEqual( firstArray, secondArray));
	  
	   }


Momentan vergleiche ich ja immer nur die Elemente an der gleichen Stelle, also wird mir false ausgegeben, aber wie kann ich die Methode verändern, dass jedes Element aus firstArray mit jedem Element aus secondArray verglichen wird?
 
Zuletzt bearbeitet:
Hallo 🙂

der Anfang sieht schonmal gut aus, deine Herangehensweise richtig. Du gehst bereits in der Schleife beide Arrays durch. Der !=-Operator ist wahr, wenn beide Seiten unterschiedlich sind. In dem Fall gehst du mit continue weiter, ansonsten gibst du true zurück. Ist das gewollt?

Ein anderes Problem wird entstehen, wenn die Längen unterschiedlich sind, dann existiert das Element im anderen Array ja nicht. Aber vielleicht kannst du etwas über die Gleichheit aussagen, wenn die Längen unterschiedlich sind?
 
Wenn alle Objekte mit allen verglichen werden sollen, dann müssten alle gleich sein. Das geht wenn du das erste Zeichen in array1 einließt und dann über das erste Array iterierst. Sollte das eingelesene Zeichen dem aktuellen Zeichen im Array entsprechen, dann machst du weiter. Ansonsten gibst du false zurück. Dann machst du dasselbe mkt demselben Zeichen beim zweiten Array.
 
Ok, wenn es über die Gleichheit leichter ist, habe ich das mal geändert, aber ich weiss leider immernoch nicht wie ich das machen soll falls die gleichen Einträge an unterschiedlichen Positionen sind und wie ich das mit der Länge machen soll 🙁

Aber jetzt sieht es zumindest so aus:
Java:
static boolean arraysAreEqual(char[]firstArray, char[]secondArray) { 
	
	for( int i = 0; i < secondArray.length; i++)
	
	     if(firstArray[i] == secondArray[i])
		    break;
		 
		     else 
		     {return false;
		     }
			 
		return true;
		 }
 
Ok, nein, das funktioniert so nicht, jetzt wird mir immer false ausgegeben, auch wenn an den gleichen Positionen, die gleichen Buchstaben stehen 🙁

Ist mein Fehler, dass sobald die 2 gleichen Elemente nicht an der 0. Position stehen geht es in die else Bedingung, wo dann direkt false ausgegeben wird und momentan sagt es dann nur true, wenn die 1. zwei Buchstaben der Arrays gleich sind.
Wenn das mein Fehlerist, weiss ich leider nicht wie ich den behebe 😀
 
Zuletzt bearbeitet:
Das break sorgt dafür, dass die Schleife sofort unterbrochen wird - du hörst also ab der ersten Übereinstimmung mit der Untersuchung auf. Ich fand deine erste Idee mit dem Test auf Ungleichheit einfacher, du hattest eigentlich nur if- und else-Zweig dort vertauscht 🙂

Aber nochmal zur Aufgabenstellung: Sollen die elementweise vergleichen werden oder tatsächlich alle mit allen? Also sind nur "abc" und "abc" gleich, "abc" und "acb" aber nicht?
 
Oh ich schaffe es doch, also jetzt sieht's so aus:
Java:
static boolean arraysAreEqual(char[]firstArray, char[]secondArray) { 
	
	for( int i = 0; i < secondArray.length; i++)
	
	     if(firstArray[i] == secondArray[i])
		    return true;
		 
		     else 
		     { continue;
		     }
			 
		return false;
		 }

aber es hängt immernoch mit den unterschiedlichen Längen und Positionen...
 
Hm. Deine momentane Variante gibt true zurück, sobald zwei Elemente übereinstimmen. Im Fall "abc" vs. "acb" würde sie also true zurückgeben.

Das Problem mit den Längen könntest du lösen, indem du die Längen einfach vor der Schleife vergleichst - denn vielleicht musst du die Schleife gar nicht betreten, falls sich die Längen unterscheiden? 🙂
 
also soweit ich das verstanden habe soll die Methode true ausgeben sobald auch nur 1 Element der Arrays gleich ist. Also dann für abc und ecr -> true

Aber hier mal die genaue Aufgabenstellung:
Implementieren Sie eine Funktion static boolean arraysAreEqual(char[]firstArray, char[]secondArray), die genau dann true zurückgibt, wenn zwei Arrays aus Zeichen identisch sind.

Mhm oder ist damit gemeint, dass die beiden Arrays komplett identisch sein müssen?
 
Zuletzt bearbeitet:
Ich würde sagen: Ja. Deshalb war dein allererster Ansatz auch schon sehr nah an der Lösung 🙂 Denn Arrays sind identisch, wenn sie die gleiche Länge haben und elementweise identisch sind.
 
So ich habe da jetzt noch das mit der Länge eingebaut und es hat mir auch für meine Beispiele das richtige ausgegeben, stimmt es denn jetzt so?

Java:
static boolean arraysAreEqual(char[]firstArray, char[]secondArray) { 
	
	for( int i = 0; i < secondArray.length; i++)
	     if (secondArray.length != firstArray.length)
		     return false;
	
	          else {if(firstArray[i] == secondArray[i])
		            continue;
		 
		            else 
		          { return false;
		          }}
			 
		return true;
		 }
 
Ja, der Code ist nun korrekt - super 🙂 Jetzt könnte man da noch ein bisschen aufräumen und für Ästhetik sorgen:

* du prüfst bei jedem Element erneut ganz schüchtern, ob die Länge auch wirklich noch stimmt 😉 Man könnte dies vor der Schleife prüfen und, falls die Länge sich unterscheidet, direkt false zurückgeben, ohne erst die Schleife zu betreten.

* der Teil else "if(firstArray == secondArray) continue;" hat gar keinen Effekt. Denn die Schleife wird danach ohnehin weiter durchlaufen. Die letzte Anweisung einer Schleife ist unsichtbar immer continue, das muss man nicht manuell machen 🙂

* die Einrückung des Codes hat mittlerweile etwas gelitten, sodass er schwierig zu lesen ist

Aber die Funktionalität passt 🙂
 
Ich bin ja schon froh, dass das Ding jetzt das macht, was ich wollte. Aber ok, ich setze mich noch dran und verschönere es ein wenig 🙂
und vielen, vielen Dank für die Hilfe!!!!!
 

Neue Themen


Zurück
Oben