Warum grad so?

Münchner

Aktives Mitglied
Servus,

ich häng grad an einem Denkproblem, ich hoffe Ihr könnt mir da weiterhelfen:
Gegeben sei folgendes Codestückerl:
Java:
public class ArrayChecks {	
	static boolean isSorted(double[] arr) {
		
		for(int i=1;i<arr.length;i++){
			if(arr[i-1]<=arr[i]){
			return true;
			}			
		}
		return false; // Diese Zeile muss eventuell überarbeitet werden.
	}
	public static void main(String[] args) {
		double[] a1 = new double[] { 4, 1, 7, 9, 12, 16, 16, 38 };
		System.out.println("a1 sortiert: " + isSorted(a1)); 

		
	}
}
Das ist so wies dasteht nicht richtig (was ich aber grad nicht einseh).
Korrekterweise schaut es so aus:
Java:
static boolean isSorted(double[] arr) {
		
		for(int i=1;i<arr.length;i++){
			if(arr[i-1]>arr[i]){
			return false;
			}			
		}
		return true; // Diese Zeile muss eventuell überarbeitet werden.
	}

Jetzt wurde mir schon gesagt, dass ich da falsch denke und in der oberen Lösung schon nach dem ersten Vergleich abgebrochen wird, und nicht jedes Element verglichen wird.
Aber eigentlich müsste es doch so wie es da steht, false ausgeben, weil das array ja eben nicht sortiert ist???

Hoffe jemand klärt mich auf:oops:
 

javimka

Top Contributor
Das Problem ist, dass die Methode in der ersten Version sofort abbricht und true zurückgibt, wenn das zweite Element grösser als das erste ist. Nur weil die ersten beiden Elemente in der richtigen Reihenfolge sind, heisst das aber noch nicht, dass auch die Reihenfolge aller nachfolgenden Elemente stimmt.
 

Münchner

Aktives Mitglied
da steh ich jetzt voll aufm Schlauch.
Ich versteh deine Erklärung, aber hier ist das erste Element doch 4 und das zweite 1, also ist das erstw doch nicht kleiner als das zweite???
 

javimka

Top Contributor
ja klar, für das gegebene Beispiel funktioniert es bei den ersten beiden Elementen schon, aber nicht im allgemeinen.
Das Programm würde z.B. behaupten, die Folge 3,4,9,8,7,6 sei aufsteigend sortiert.
 

eRaaaa

Top Contributor
genau, 4 und 1 prüfst du durch die if-Abfrage, die Bedigung ist also false, also weiter in der Schleife:
dann prüfst du 1 mit 7, die Bedingung ist dann aber wahr , weil 1 ja kleiner = 7 ist, und dann gibst du TRUE zurück !

Das vorher aber schon eins false war ignorierst du somit, und das danach auch noch andere false sein könnten auch !
 

0din

Bekanntes Mitglied
deine erste version läuft wie folgt ab:
nimm die ersten werte
wenn die sortiert sind -> brich die methode ab und gib true zurück
wenn die nicht sortiert sind -> schau die nächsten elemente an
(wenn deine schleife dann mal alle elemente überlebt hat)
brich die methode ab und gib false zurück

du die zweite lösung läuft so ab:

nimm die ersten werte
wenn die sortiert sind -> mach garnix
wenn nich sortiert -> brich ab und gib false zurücl
(wenn se ans ende kommt)
brich ab und gib true zurück

wie du siehst sind da gewaltige unterschiede!
 
Zuletzt bearbeitet:

Münchner

Aktives Mitglied
Ok. Beim ersten fall trifft es also nicht zu, dass es kleiner ist. Also geht er in der Schleife eins weiter.
Beim zweiten Mal trifft die Bedingung aber zu und es kommt
Code:
true
zurück, weil die Bedingung jetzt zutrifft.

Für den richtigen Fall trifft die Bedingung gleich zu, wenn 4 an der ersten, 1 an der zweiten steht, und ansonsten gar nicht, wenn das array korrekt sortiert ist. Also kommt
Code:
return true
am Ende, wenn alles geprüft wurde.
 

eRaaaa

Top Contributor
Ja. true interessiert hier eig. nicht so sehr wie false.

Wie würdest du im wahren Leben denn prüfen, wenn dir Jmd eine Reihe von Zahlen gibt ob die sortiert sind oder nicht? Du wirst sie (wahrscheinlich) der Reihe nach durchgehen und gucken ob die Nächste größer ist, wenn nicht, würdest du doch gleich sagen: => mein Freund, die sind aber nicht sortiert. Oder würdest du die restlichen xxxx Zahlen auch noch prüfen, bzw wenn die erstne Beiden sortiert sind sagen: jepp, sind alle sortiert ???:L Wohl eher nicht !
 

Ähnliche Java Themen


Oben