2017-07-01 10 views
0

Im folgenden Java-Code:Warum wird diese For-Schleife übersprungen?

public static void main(String[] args) { 
    Integer[] k = new Integer[] {0, 1, 2, 3}; 

    int m = 0; 
    while (m < k.length) { 
     for (int i = 0; i < k.length && k[i] != null; i++) 
      System.out.print(k[i] + " "); 
     System.out.println(""); 
     k[m++] = null; 
    } 
} 

Ich habe versucht, die folgende Ausgabe zu erhalten:

0 1 2 3 
1 2 3 
2 3 
3 

jedoch die innere for-Schleife wird insgesamt nach dem ersten Durchgang übersprungen, das heißt, nach die Ausgabe 0 1 2 3, und weil das erste Element nach dem ersten Durchgang auf Null gesetzt wurde, aber ich verstehe nicht, warum das wichtig ist, kann jemand bitte erklären? wirklich verwirrt. Danke im Voraus. :)

+7

Wissen Sie, was das 'k [i] = null' in dem Loop-Testmittel!? – user2357112

+1

Und ... wissen Sie, was 'k [m ++] = null 'tut? –

+0

Ich empfehle dringend, lernen, Ihren Debugger zu verwenden. –

Antwort

1

Wenn Sie i = m anstelle von i=0 verwenden, dann wird es funktionieren.

public static void main(String[] args) { 
    Integer[] k = new Integer[] {0, 1, 2, 3}; 

    int m = 0; 
    while (m < k.length) { 
     for (int i = m; i < k.length && k[i] != null; i++) 
      System.out.print(k[i] + " "); 
     System.out.println(""); 
     k[m++] = null; 
    } 
+0

Und Sie können 'k [m ++] = null;' (machen Sie es 'm ++'), und beseitigen Sie den 'k [i]! = Null 'Test. –

+0

Ja natürlich ist es in diesem Fall ziemlich überflüssig, ich wollte nur die Antwort auf seinen tatsächlichen Fehler konzentrieren. –

0

i < k.length && k[i] != null dies macht die for-Schleife zu stoppen. Ihr Index (i) beginnt bei 0 so, nachdem Sie Schleife das erste Mal, wenn Sie das folgende Szenario haben, wenn das zweite Mal Looping:

k = {null, 1, 2, 3} 
m = 1 

m < k.length = true 

i = 0 
i < k.length = true 

// k = {null, 1, 2, 3} 
// i = 0 
// k[i] = k[0] = null 
k[i] != null = false 
1

Versuchen Sie, durch den Code gehen Iteration pro Iteration und aktualisiert die Werte:

Nehmen wir an, wir diese Codezeile zum ersten Mal erreicht:

// Right now, (**before** the next line is executed), 
// `m` is still `0`, `k.length` is 4 (which is how we reached this point). 
// `i` is 0, which is less than `k.length`, and `k[i]` is `0`. 

// This line sets `k[m]` to `null`, and then sets `m` to `m+1`. 
k[m++] = null; 

// And now (**after** the above line is executed), `m` is 1, 
// `k.length` is still 4, so we get to go into the while loop for the second time. 
// At this point, `k: [null, 1, 2, 3]`. 

In der while-Schleife, wir die inneren Schleife dann wieder begegnen, die (das auf dieser Linie unsere zweite Zeit ist) nur nicht zwei for Loops verwenden, ist es ein wenig klarer

// Evaluating: i < k.length && k[i] != null 
i < k.length // i: 0, k.length: 4, this is true 
k[i] != null // i: 0 here, and k[0]: `null`, so this is false 

true && false // returns false -> Don't go in the inner for-loop 
+0

Danke für die ausführliche Erklärung. Es war im Nachhinein so offensichtlich, ein Hirn-Furz in der Tat. Danke nochmal –

0

ich dich nicht sehen, warum: ist:

// ...in the while loop for the second time... 
// Remember, the k array now looks like: k: [null, 1, 2, 3] 
for (int i = 0; i < k.length && k[i] != null; i++) 

Ihr Zustand an diesem Punkt scheitert, weil

public static void main(String[] args) { 
    Integer[] k = new Integer[] {0, 1, 2, 3}; 

    for (int m = 0; m < k.length; m++) { 
     for (int i = 0; i < k.length && k[i] != null; i++) { 
      System.out.print(k[i] + " "); 
     } 
     System.out.println(""); 
     k[m] = null; 
    } 
} 

Die Problembeschreibung ist Ihre innere Schleife, die überprüft, ob k[i] != null. Die zweite Anweisung einer for-Schleife ist eine Beendigungsbedingung. Wenn es false zurückgibt, endet die Schleife. Im Wesentlichen versuchen Sie, keine Werte zu drucken, wenn sie null sind, aber dies wird Ihre Schleife bei Erreichen eines Nullwerts einfach beenden. Stattdessen innerhalb der inneren Schleife um den Zustand des Elements überprüfen:

for (int i = 0; i < k.length; i++) { 
    if (k[i] != null) { 
     System.out.print(k[i] + " "); 
    } 
} 

Zusätzlich können Sie auch die auf den gegenwärtigen Index überspringen nun diese innere Schleife (int i = m) statt auf null einstellen, so dass die zweite Iteration 1 -3, und dritte ist 2-3, usw. Dies macht zusätzlich die Null-Prüfung/Einstellung überflüssig, sowie die Verwendung von int[].So sieht die fertige Lösung wie:

public static void main(String[] args) { 
    int[] k = new int[] {0, 1, 2, 3}; 

    for (int m = 0; m < k.length; m++) { 
     for (int i = m; i < k.length; i++) { 
      System.out.print(k[i] + " "); 
     } 
     System.out.println(""); 
    } 
} 
0

Das Problem in diesen Aussagen verursacht:

k[i] != null;

k[m++] = null;

Wenn Sie setzen das nächste Element im Array null zu sein, Die Nullprüfungsbedingung in der for-Schleife schlägt fehl und die Schleife wird nicht ausgeführt.

diese beiden Aussagen entfernen und dies tun:

class Test { 
    public static void main(String args[]) { 
     int k[] = {0, 1, 2, 3}; 
     int m = 0; 
     while (m < k.length) { 
      for (int i = m; i < k.length; i++) 
       System.out.print(k[i]); 
      System.out.print("\n"); 
      m++; 
     } 
    } 
} 
Verwandte Themen