# 2 Arrays vergleichen



## Joptionpane (11. Jan 2012)

Abend an alle,

bin wieder am üben für die Prüfungen und hänge an einer Aufgabe.
es soll geprüfut werden, ob die zwei Felder feld1 und feld2 die gleiche Größe und den gleichen Inhalt haben (d.h. die gleichen Werte an den gleichen Positionen).
Ich wollts jetzt erstmal soweit haben, das erst überprüfut wird, wo gleiche werte auftauchen(die länge der arrays hab ich mal gleichgroß gesetzt und ist momentan für mich zweitrangig).

Mein Ansatz wäre dieser. Komme mit bool'schen Methoden nicht gut klar..


```
public static void main(String[] args) {

		double[] array1 = { 14.0, 16.0, 19.0, 12.0, 16.0, 5.0, 18.0, 9.0, 3.0,
				5.0 };

		double[] array2 = { 12.0, 11.0, 19.0, 2.0, 6.0, 15.0, 3.0, 9.0, 1.0,
				15.0 };

		sindGleich(array1, array2);

		System.out.print(sindGleich);

	}

	public static boolean sindGleich(double[] array1, double[] array2) {

		for (int i = 0; i <= array1.length - 1; i++) {
			for (int j = 0; j <= array2.length - 1; j++) {

				if (array1[i] == array2[j]) {
					return true;

				} 
				
			}
		}
		return false;

	}

}
```


----------



## HimBromBeere (11. Jan 2012)

Die Idee ist schonmal jut, allerdings solltest du nicht sofort nach dem ersten Array-Element gleich true zurückgebe, sondern erst, wenn alle durchlaufen sind, also hinter die Doppelschleife. Bis dahin ist der return-Wert erstmal false.

EDIT: Bevor du dir allerdings die Mühe des Durchlaufs machst, solltest du UAF JEDEN FALL die Größen vergleichen, um nicht unnötigerwiese zwei Array zu durchlaufen, die 10000 Elemente beinhalten...

Dafür musst du nur prüfen: arr1.length == arr2.length


----------



## Schandro (11. Jan 2012)

du musst innerhalb der schleife auf != prüfen und false returnen und am Schluss true zurückgeben...


----------



## bygones (11. Jan 2012)

nimm doch Arrays (Java Platform SE 6)[], double[])

argh - zu dumm dafuer... equals Methode von Arrays fuer double[] einfach


----------



## Joptionpane (11. Jan 2012)

Wäre dieser Ansatz dann besser? 





```
public static void main(String[] args) {

		double[] array1 = { 14.0, 16.0, 19.0, 12.0, 16.0, 5.0, 18.0, 9.0, 3.0,
				5.0 };

		double[] array2 = { 12.0, 11.0, 19.0, 2.0, 6.0, 15.0, 3.0, 9.0, 1.0,
				15.0 };

		sindGleich(array1, array2);

		System.out.print(sindGleich);

	}

	public static boolean sindGleich(double[] array1, double[] array2) {

		for (int i = 0; i <= array1.length - 1; i++) {
			for (int j = 0; j <= array2.length - 1; j++) {

				if (array1[i] != array2[j]) {
					return false;
				} 
				
			}
		}
		return true;

	}

}
```


----------



## Gast2 (11. Jan 2012)

Ja, das ist besser. Aber deine main Methode kompiliert nicht.


----------



## bygones (11. Jan 2012)

lass es laufen dann siehst du es?!


----------



## Joptionpane (11. Jan 2012)

bygones hat gesagt.:


> lass es laufen dann siehst du es?!





ist mir klar das es momentan noch nicht laufen wird, habe darum extra bei meinem ersten Post angegeben, dass ich so meine schwächen mit bool'schen Methoden habe.

Da die Methode nur true oder false ausliefert kann es nicht einfach ein S.o.p machen, das weiß ich zumindest, aber wie krieg ich es nun hin, dass es mir die gewünschten Zahlen ausgibt?


----------



## Gast2 (11. Jan 2012)

Du kannst dir nen boolean ganz normal ausgeben lassen:

```
System.out.print(sindGleich(array1, array2));
```

Was für Zahlen willst du ausgeben lassen? Du prüfst doch nur ob zwei Arrays gleich sind.


----------



## HimBromBeere (11. Jan 2012)

Du rufst zwar sindGleich() auf, aber verwirfst das Ergebnis vollständig. Du müsstest in in einer Variablen speichern oder direkt in die System.out.print() reinschreiben


----------



## Joptionpane (11. Jan 2012)

läuft, hatte die Aufgabenstellung falsch verstanden. 
Soll nur true oder false ausgegeben werden, wenn array1 4 einträge hat und das andere 5 brauch ich garnicht den Inhalt mehr zu vergleichen und falls doch gleich lang müssen 'alle' Werte identisch sein.

Wäre theoretisch jetzt richtig wenn es so verlangt wäre.

Würde es mit dieser bool'schen Methode aber gehen falls als Frage wäre: Es sollen alle Zahlen ausgegeben werden, die an gleicher Position den gleichen Wert haben(wie in meinem Code die 19.0 an dritter stelle z.b.) ?


----------



## HimBromBeere (11. Jan 2012)

Ne, denn dann musst du ja auf jeden Fall mehr als nur eine Zahl ausgeben (also ein Array, Liste, ...)


----------



## Joptionpane (11. Jan 2012)

Die eigentliche Aufgabe müsste damit gelöst worden sein.



```
public static void main(String[] args) {

		double[] array1 = { 14.0, 16.0, 19.0, 12.0, 16.0, 5.0, 18.0, 9.0, 3.0,
				5.0 };

		double[] array2 = { 12.0, 11.0, 19.0, 2.0, 6.0, 15.0, 3.0, 9.0, 1.0,
				15.0 };

		sindGleich(array1, array2);

		System.out.print(sindGleich(array1, array2));

	}

	public static boolean sindGleich(double[] array1, double[] array2) {

		if (array1.length != array2.length) {
			return false;
		} else {

			for (int i = 0; i <= array1.length - 1; i++) {
				if (array1[i] != array2[i]) {
					return false;
				}

			}
		}
		return true;
	}
}
```


----------



## Schrubber (11. Jan 2012)

```
sindGleich(array1, array2);
 
        System.out.print(sindGleich(array1, array2));
```

Die 1. Zeile kannste weglassen.

Du führst einmal deine Methode aus (1. Zeile), verarbeitest das Ergebnis nicht. Du rufst dann in der 2. Zeile die Methode erneut auf und nimmst dann erst das Ergebnis als Ausgabe.


Uuuund: Deine Methode gibt IMMER false zurück (bei den Werten, die du vorgibst). Nur der letzte Wert ist ausschlag-gebend. Sind alle vorher gleich, nur der letzte anders, ist es false.

Und du kannst es vll ein wenig kürzer gestalten:


```
public static boolean sindGleich(double[] array1, double[] array2) {
        boolean gleich = false;
        if(array1.length == array2.length) {
                for(int i = 0; i < array1.length; i++) {
                        if(array1[i] == array2[i]) {
                                gleich = true;
                        } else {
                                gleich = false;
                        }
                }
        }
        return gleich;
}
```


----------



## hdi (11. Jan 2012)

Hau noch schnell den überflüssigen sindGleich()-Aufruf in Zeile 9 raus.

edit: Zu laaaaaansgaaaaam


----------



## Joptionpane (11. Jan 2012)

Zeile 9 hab ich bereits rausgenommen gehabt, hat mir ein Kommilitone ebenfalls empfhohlen, hat ich übersehen  danke an alle ) 

hab jetzt mal alles, müsste soweit stimmen, auch von der Effizienz her(teilweise):


```
public static void main(String[] args) {

		double[] array1 = { 14.0, 16.0, 19.0, 12.0, 16.0, 5.0, 18.0, 9.0, 3.0,
				5.0 };

		double[] array2 = { 12.0, 11.0, 19.0, 2.0, 6.0, 15.0, 3.0, 9.0, 1.0,
				15.0 };

		
		System.out.print(sindGleich(array1, array2));

	}

	public static boolean sindGleich(double[] array1, double[] array2) {

		if (array1.length != array2.length) {
			return false;
		} else {

			for (int i = 0; i <= array1.length - 1; i++) {
				if (array1[i] != array2[i]) {
					return false;
					
				}
				break;

			}
		}
		return true;
	}
}
```


----------



## faetzminator (11. Jan 2012)

Das geht immer noch einfacher. Das else ist unnötig. Ebenso das break. Zusätzlich rechnest du [c]<= length - 1[/c] statt [c]< length[/c].
Diese Dinge wegoptimiert, gehts eigentlich nicht mehr einfacher:

```
if (array1.length != array2.length) {
    return false;
}
for (int i = 0; i < array1.length; i++) {
    if (array1[i] != array2[i]) {
        return false;
    }
}
return true;
```


----------

