2016-03-30 11 views
0

Ich schreibe gerade eine for-Schleife, um durch ein 2D mit 38 Elementen zu gehen. Einige dieser Elemente sind jedoch null und ich möchte, dass die for-Schleife sie einfach überspringt (weil ich in dem Puzzle, das ich löse, keine Bewegungen mit ihnen verbunden sind). Eine schnelle Suche ergab, dass ich eine Iteration mit einer einfachen continue Anweisung in einer if Anweisung zu Beginn der for Schleife überspringen kann. Allerdings möchte ich mehrere Iterationen überspringen, und die if-Anweisung Ich schrieb nicht funktioniert:Überspringen bestimmter Iterationen einer for-Schleife

for (int i = 0; i < triplets.length; i++) { 
    if (i == 18 || 19 || 25 || 26 || 28 || 29 || 31 || 32) { 
     continue; 
    } 

Gibt es eine Alternative zu machen 8 individuelle if Aussagen oder bin ich damit nicht weiter?

+3

Sie können eine Bedingung nicht logisch verketten, der '|| 'Operator erfordert, dass Sie es auf jeder Seite einen boolean übergeben, zB' i == 18 || i == 19 || ... ' – azurefrog

+0

Sie haben gesagt, dass die Elemente null sind. Warum können Sie nicht testen, ob das Element null ist, anstatt zu versuchen, die spezifischen zu überspringenden Bewegungen anzugeben? Was andere Alternativen betrifft, können Sie 'if (i == 18 || i == 19 ...)' machen. Ich würde in eine Liste laden und nach der Anwesenheit in der Liste suchen. Wie ich sehe @Cootri tat das unten, als ich tippte ... – KevinO

+2

Ich bin mir nicht sicher, warum ich wegen der Frage nach einer einfachen Frage abgelehnt werde, aber hey, das ist die pedantische Überlauf-Community für dich. Es scheint, es war ein einfacher Syntaxfehler. Vielen Dank für Ihre Hilfe @azurefrog –

Antwort

5

Sie geben die Bedingung nicht richtig. Es sollte wie folgt sein:

if (i == 18 || i == 19 || i == 25 || i == 26 || i == 28 || i == 29 || i == 31 || i == 32) { 
    continue; 
} 

Alternativ würde ich Sie so etwas wie dies zu tun, statt vorschlagen:

  1. eine HashSet erstellen und die Werte setzen, um in ihm verglichen werden.

  2. Überprüfen Sie, ob HashSeti enthält, und wenn ja, fahren Sie mit der Schleife fort.

    Set<Integer> set = new HashSet<>(); 
    set.add(18); 
    set.add(19); 
    set.add(25); 
    set.add(26); 
    set.add(28); 
    set.add(29); 
    set.add(31); 
    set.add(32); 
    
    if(set.contains(i)) { 
        continue; 
    } 
    
+0

Die 'else' sind redundant in Ihrem Code – fge

+0

@fge Nur realisierte es! Danke :) – user2004685

2

Gibt es eine Alternative zu machen 8 Einzel wenn Aussagen oder ich damit stecke?

können Sie ohne List erstellen und Code ausführen, wenn der Strom Triplett darin nicht existiert (Code ohne continue Anrufe prägnanter ist).

List<Integer> exclude = Arrays.asList(18, 19, 25, 26, 28, 29, 31, 32); 
for (int i = 0; i < triplets.length; i++) { 
    if (!exclude.contains(i)) { 
     ....//your code 
    } 
} 

Wenn die Ausschlussliste groß ist, dann ist es eine gute Idee ArrayList mit HashSet, zu ersetzen, die O (1) Suche Komplexität hat statt O (N) (aber verbraucht etwa 5.5 times more memory für jeden Element)

+1

Warum hast du ein '!' Am Anfang? – user7

+1

@ user7 Weil Sie den Block ausführen möchten, wenn der Index NICHT in der Ausschlussliste ist. – FredK

+0

Ok. Aber früher hatten Sie "weiter" in Ihrem if – user7

Verwandte Themen