2016-07-30 5 views
1

Betrachten Sie den folgenden Code, der wie viele jedes Element zählt ein Array hat:Warum wird der if-Block nicht für den letzten Fall ausgeführt?

public static void getCounts(int[] list) { 
    int current = list[0]; 
    int count = 0; 
    for (int i = 0; i < list.length; i++, count++) { 
     if (list[i] > current) { 
      System.out.println(current + " occurs " + count + timeOrTimes(count)); 
      current = list[i]; 
      count = 0; 
     } 
    } 
    System.out.println(current + " occurs " + count + timeOrTimes(count)); 
} 

Für diese Frage, bitte übernehmen list in aufsteigender Reihenfolge sortiert ist. Wenn list[1, 1, 2, 3, 4, 4] ist, zum Beispiel, ist die Ausgabe:

1 occurs 2 times 
2 occurs 1 time 
3 occurs 1 time 
4 occurs 2 times 

Nun, wenn ich von den println loszuwerden, die nach der for kommen -loop, dh

public static void getCounts(int[] list) { 
    int current = list[0]; 
    int count = 0; 
    for (int i = 0; i < list.length; i++, count++) { 
     if (list[i] > current) { 
      System.out.println(current + " occurs " + count + timeOrTimes(count)); 
      current = list[i]; 
      count = 0; 
     } 
    } 
    // System.out.println(current + " occurs " + count + timeOrTimes(count)); 
} 

Dann die gleiche Beispiel Eingabe mit , der Ausgang wird:

1 occurs 2 times 
2 occurs 1 time 
3 occurs 1 time 

Mit anderen Worten, die if Block tun es führt nicht aus, wenn list[i] der maximale Wert des Arrays ist. Warum ist das der Fall? Im obigen Beispiel ist der Index der ersten 4i = 4 und list[4] > 3, daher ist die bedingte Anweisung erfüllt, wird aber immer noch nicht ausgeführt.

Wie kann ich den Code so einstellen, dass der if Block für alle Fälle ausgeführt wird?

Dank

+0

Diese Frage ist auf Anfängerniveau, aber gut durchdacht und gut geschrieben, trifft alle notwendigen Punkte. Ich wünschte, mehr der Anfängerfragen wären so gut wie diese. –

Antwort

3

Der letzte println ist notwendig, weil Sie Ihre print-Anweisung auf einem Änderung im Wert von list[i] und Druck das Ergebnis für den vorherigen Wert auslösen. Am Ende des Programms gibt es keine letzte "Änderung", so dass Sie den letzten Fall separat behandeln müssen.

Dies (die Notwendigkeit einer abschließenden Operation nach der Schleife) ist ein Standardkodierungsmuster, das immer dann auftritt, wenn eine Variablenänderung in einer Sequenz eine Operation am Ende einer Charge auslöst. Eine Möglichkeit, darüber nachzudenken, ist, dass es einen virtuellen Wert gibt, einen über das Ende des Arrays hinaus, der immer größer ist als jeder mögliche vorherige Wert und das Ende der Daten signalisiert. Es gibt keine Notwendigkeit, es zu testen oder tatsächlich zu implementieren, aber Sie müssen immer noch die Operation (in Ihrem Fall eine println) codieren.

Die Operation könnte viel komplexer sein. In diesem Fall würden Sie sie in eine Methode kapseln, um Code-Duplikation zu vermeiden. Ihr Code könnte leicht von der Kapselung der println in einer Methode outputCount(int value, int count) profitieren. Zum Beispiel

private void outputCount(int value, int count) { 
    System.out.println(value + " occurs " + count + timeOrTimes(count)); 
} 

Für Ihren Anwendungsfall ist es fast nicht wert, aber wenn der End-of-Batch-Betrieb viel mehr als 1 Zeile Code wäre, würde ich auf jeden Fall ein Verfahren für sie schreibt, anstatt den Code des Wiederholen .

+0

Ah, das macht so viel mehr Sinn. Danke für die kurze Erklärung. Nur um sicherzustellen, dass ich richtig verstanden habe, sollte es bei for-Schleifen, die auf einer Variablenänderung beruhen, Code geben, der ausgeführt wird, nachdem die Schleife abgeschlossen ist, um die endgültige Änderung anzuzeigen, richtig? –

+0

Das ist richtig, wenn Sie absichtlich das Ende eines Arrays ablaufen lassen, müssen Sie mit dem letzten Datenstapel umgehen, der keine Änderung "nach" hatte, um die Summierung auszulösen (oder was auch immer). Siehe meine erweiterte Antwort. –

+0

Würdest du gerne zeigen, wie man diesen Code einkapselt? Ich bin ein Anfänger in Java und habe dieses Konzept noch nicht gelernt. –

Verwandte Themen