Zurück zum ersten Index nach dem Erreichen des letzten in einem Array

8

Nachdem mein Array in der for-Schleife den letzten Index erreicht hat, bekomme ich eine Ausnahme, dass der Index außerhalb der Grenzen liegt. Ich wollte, dass es zum ersten Index zurückkehrt, bis z gleich ctr ist. Wie kann ich das tun?

Mein Code:

%Vor%     
pchan 10.09.2013, 17:35
quelle

5 Antworten

4

Sie müssen einen Index verwenden, der auf die Größe des Arrays beschränkt ist. Genauer gesagt, und esoterisch gesprochen, müssen Sie die For-Loop-Iterationen {0..9} den gültigen Indizes für das Flammen-Array {0 .. flames.length()-1 } zuordnen, die in diesem Fall dieselben sind wie { 0..5}.

Wenn die Schleife von 0 bis 5 durchlaufen wird, ist das Mapping trivial. Wenn die Schleife ein sechstes Mal iteriert, müssen Sie sie wieder dem Array-Index 0 zuordnen, wenn sie zum siebten Mal durchlaufen wird, ordnen Sie sie dem Array-Index 1 zu usw.

== Naive Art ==

%Vor%

== Ein passenderer Weg ==

Dann können Sie dies verfeinern, indem Sie erkennen, dass flames.length() eine Invariante ist, die Sie aus einer for-Schleife entfernen.

%Vor%

== Wie man es macht ==

Nun, wenn Sie aufmerksam sind, können Sie sehen, dass wir nur modulare Arithmetik im Index machen. Also, wenn wir den modularen (%) Operator verwenden, können wir Ihren Code vereinfachen:

%Vor%

Wenn Sie mit solchen Problemen arbeiten, denken Sie über Funktionszuordnungen von einer Domäne (in diesem Fall für Schleifeniterationen) an einen Bereich (gültige Arrayindizes) nach.

Noch wichtiger ist, dass Sie es auf Papier ausarbeiten, bevor Sie überhaupt anfangen zu programmieren. Das wird Sie bei der Lösung dieser elementaren Probleme sehr weit bringen.

    
luis.espinal 10.09.2013, 18:04
quelle
6

Während luis.espinal eine Antwort auf die Leistung gibt, ist es besser, ich denke, sollte man auch nehmen ein Blick in Iterator , da sie Ihnen mehr geben Flexibilität Lesen hin und her.

Das bedeutet, dass Sie genauso einfach FLAMESFLAMES als FLAMESSEMALF schreiben könnten, etc ...

%Vor%

Aus Neugier, diese Schleife 1M mal (durchschnittliches Ergebnis von 100 Samples) zu machen, braucht man:

%Vor%

Bearbeiten: Cycle-Iteratoren, wie lbalazscs schön ausgedrückt haben, sind noch eleganter. Sie haben einen Preis und die Guava-Implementierung ist viermal langsamer. Sie könnten Ihre eigene Implementierung durchführen, zäh.

%Vor%     
Frankie 10.09.2013 18:16
quelle
5

Sie sollten % verwenden, um zu erzwingen, dass der Index in flames.length bleibt, damit er einen gültigen Index

erstellt %Vor%     
sanbhat 10.09.2013 17:37
quelle
2

Sie können Folgendes versuchen: -

%Vor%     
Rahul Tripathi 10.09.2013 17:37
quelle
1

So würde ich das machen:

%Vor%

Die textLoop-Methode:

%Vor%

BEARBEITEN: Fehler im Code gefunden ( idx muss außerhalb der Schleife initialisiert werden). Es ist jetzt behoben. Ich habe es auch in eine separate Funktion umgestaltet.

    
AJMansfield 10.09.2013 20:13
quelle

Tags und Links