2017-02-28 4 views
-1

Ich schrieb diesen Code, um ein Element in einem Array zu finden, das ziemlich gut funktioniert, aber ich verstehe nicht, wie es 100% funktioniert. Meine Frage ist, wie kommt es (j == nElems) wenn es nur von 0 bis 9 läuft? Ich habe auch bemerkt, dass die Bedingung außerhalb der for-Schleife erfüllt ist, wenn der Suchschlüssel nicht gefunden wird.Warum ist diese Bedingung erfüllt? (j == nElems)

public class ArrayApp { 
    public static void main(String args[]) { 
     int nElems = 10; 
     int[] arr = new int[nElems]; 
     int j; 
     int searchKey; 
     arr[0] = 77; 
     arr[1] = 99; 
     arr[2] = 44; 
     arr[3] = 55; 
     arr[4] = 22; 
     arr[5] = 88; 
     arr[6] = 11; 
     arr[7] = 00; 
     arr[8] = 66; 
     arr[9] = 33; 
     for (j = 0; j < nElems; j++) { 
      System.out.print(arr[j] + " "); 
     } 
     System.out.println(); 
     //Find 66 in array 
     searchKey = 66; 
     for (j = 0; j < nElems; j++) { 
      if (arr[j] == searchKey) { 
       break; 
      } 
     } 
     if (j == nElems) { 
      System.out.println("Cant find " + searchKey); 
     } else { 
      System.out.println("Found " + searchKey + " in position " + j); 
     } 
     //Remove 55 from array 
     searchKey = 55; // delete item with key 55 
     for (j = 0; j < nElems; j++) { // look for it 
      if (arr[j] == searchKey) { 
       break; 
      } 
     } 
     for (int k = j; k < nElems - 1; k++) { // move higher ones down 
      arr[k] = arr[k + 1]; 
     } 
     nElems--; 
     for (j = 0; j < nElems; j++) { 
      System.out.print(arr[j] + " "); 
     } 
    } 
} 
+0

Gibt es einen Grund, warum Sie die App nicht debuggen? – liorsolomon

Antwort

0
for (j = 0; j < nElems; j++) { 
    if (arr[j] == searchKey) { 
     break; 
    } 
} 

nElems ist 10. Also j < nElems zufrieden sein, bis j 10. An diesem Punkt erreicht, wird die Schleife verlassen. Es wird jedoch nur diesen Punkt erreichen, wenn der Nullpunkt nie erreicht wird (dh der Suchschlüssel wurde nicht gefunden). Sie sehen also, dass der Suchschlüssel nie gefunden wird, j wird bis 10 inkrementiert, zu diesem Zeitpunkt wird die Schleife verlassen. An diesem Punkt ist j == nElems.

0

Am Ende jeder Iteration wird j inkrementiert. Danach wird die Stoppbedingung getestet. Wenn diese Bedingung zutrifft, wird die Schleife beendet. Andernfalls wird mit dem neuen Wert j fortgefahren.

Dies bedeutet, dass Ihre for Schleife so lange wie j < nElems läuft. Einmal j == nElems, ist die for Schleife fertig. Daher muss am Ende j notwendigerweise nElems entsprechen; Andernfalls wird die Schleife niemals beendet.

1

der Blick auf Ihre for Schleife haben lassen:

for (j = 0; j < nElems; j++) { 
    if (arr[j] == searchKey) { 
     break; 
    } 
} 

Here ‚s, was Dokumentation von Oracle sagt über for Schleife:

Die Inkrementausdruck wird nach jeder Iteration durch die Schleife aufgerufen; Es ist vollkommen akzeptabel, dass dieser Ausdruck erhöht wird oder einen Wert dekrementiert.

Also, in der obigen Schleife wird j nach jeder Iteration inkrementiert. In der vorletzten Iteration wird jnElems-1 sein. Es wird die Schleife ausführen und j inkrementieren, die es dann gleich nElems machen würde.

Als if Zustand wird nach der Schleife angeordnet ist, indem es die Zeitsteuerung erreicht, wird j schon gleich zu nElems, und daher wird es true sein.

1

Wir versuchen können, zu vereinfachen, was dies für Schleife bedeutet

for (j = 0; j < nElems; j++) { 
    if (arr[j] == searchKey) { 
     break; 
    } 
} 

Die for-Schleife im Wesentlichen bis auf die folgenden bricht:

int j = 0; 
int nElems = 10; 
while(j < nElems) { 
    if(arr[j] == searchKey) { 
     break; 
    } 
    j++; 
} 

Sie können sehen, dass die letzte Bedingung wäre, wenn j entspricht 10 (nElems).

Verwandte Themen