Gibt es eine Möglichkeit, geschachtelte n-Level-Schleifen in Java zu machen?
In anderen Worten, kann ich etwas tun, wie
for() {
for {
for {
}
}
}
Außer N-mal? In anderen Worten, wenn die Methode der Erstellung der loops aufgerufen wird, ist es gegeben, einige parameter N, und die Methode würde dann erstelle N von diesen Schleifen verschachtelt in einem anderen?
Natürlich, die Idee ist, dass, sollte es eine "einfach" oder "das übliche" Weg, es zu tun. Ich habe bereits eine Idee für ein sehr kompliziertes.
InformationsquelleAutor der Frage Alexander | 2009-01-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es klingt wie Sie vielleicht möchten, schauen Sie in die Rekursion.
InformationsquelleAutor der Antwort
jjnguy ist richtig; Rekursion können Sie dynamisch erstellen variabler Tiefe Verschachtelung. Jedoch, Sie nicht bekommen Zugang zu Daten aus den äußeren Schichten, ohne ein wenig mehr Arbeit. Der "in-line-nested" Fall:
hält der Variablen
i
j
undk
im Bereich der innerste Körper zu verwenden.Hier ist ein quick-hack zu tun:
Den
IAction
- Schnittstelle legt die Rolle für eine kontrollierte Aktion, die nimmt ein array von Indizes als argument für seineact
Methode.In diesem Beispiel wird jede Instanz von
NestedFor
konfiguriert ist, indem Sie den Konstruktor mit der iteration Grenzen und die Aktion, die durchgeführt werden von der innersten Ebene. Die parameter dernFor
Methode gibt an, wie tief zu verschachteln.Hier ist ein Beispiel für die Nutzung:
und die (teilweise) Ausgabe von seinen Ausführung:
InformationsquelleAutor der Antwort joel.neely
Möchten Sie vielleicht, um zu erklären, was Sie wirklich wollen, zu tun.
Werden, wenn die äußeren
for
Schleifen tut nichts, aber die Steuerung ein Graf, dann der verschachteltefor
loops sind einfach nur ein komplizierter Weg von der Iteration durch eine Zahl, die gehandhabt werden kann, indem eine einzigefor
Schleife.Beispiel:
Ist äquivalent zu:
InformationsquelleAutor der Antwort Michael Burr
Ich dachte eigentlich über diese den anderen Tag.
Einem Beispiel, das wahrscheinlich nicht perfekt, aber ziemlich nahe an dem, was ich denke, wird gebeten, wäre die Ausgabe einer directory-Struktur
diese Weise Sie am Ende mit einem Stapel von for-Schleifen verschachtelt Ineinander, ohne den Aufwand, herauszufinden, wie genau Sie gehen sollten, zusammen.
InformationsquelleAutor der Antwort Wayne
2015 Bearbeiten: Entlang der gleichen eitel wie die vorherigen Beschwörung, ich habe das folgende Paket, um diese zu bewältigen; https://github.com/BeUndead/NFor
Die Verwendung wäre wie folgt
was in
Es unterstützt auch andere Bedingungen als
lessThan
. Die Verwendung es (mitimport static NFor.*;
):Ergibt:
Offensichtlich, loops in verschiedenen Längen und unterschiedlichen Klassen (alle boxed, numerische primitives) werden unterstützt. Der Standard (wenn nicht angegeben) ist von(0, ...).von(1, ...); aber zu(...) müssen angegeben werden.
Den
NForTest
Datei sollte zeigen verschiedene Möglichkeiten, es zu benutzen.Die grundlegende Prämisse dieser wird einfach Voraus, die 'Indizes', die jeweils wiederum eher als Rekursion.
InformationsquelleAutor der Antwort user2478398
Problem mehr braucht-Spezifikation. Vielleicht Rekursion wird Ihnen helfen, aber beachten Sie, dass die Rekursion ist fast immer eine alternative zu iteration, und Umgekehrt. Kann es sein, dass ein 2-level nested-loop kann ausreichend sein für Ihre Bedürfnisse. Lassen Sie uns einfach wissen, welches problem Sie zu lösen versuchen.
InformationsquelleAutor der Antwort John Zwinck
Die grundlegende Idee hinter verschachteln von Schleifen ist Multiplikation.
Erweiterung auf Michael Burr ' s Antwort, wenn die äußeren
for
Schleifen tut nichts, aber die Steuerung ein Graf, dann der verschachteltefor
Schleifen übern
zählt, sind einfach nur ein komplizierter Weg von der Iteration über das Produkt der Grafen mit einem einzigenfor
Schleife.Nun, wir erweitern diese Idee zu Listen. Wenn Sie Durchlaufen drei Listen, die in geschachtelten Schleifen, das ist einfach ein komplizierter Weg von der Iteration über die Produkt-Listen mit einer einzigen Schleife. Aber wie drückt man das Produkt der drei Listen?
Als erstes benötigen wir einen Ausdruck für das Produkt der Typen. Das Produkt von zwei Arten
X
undY
ausgedrückt werden kann als ein generischer Typ wieP2<X, Y>
. Dies ist nur ein Wert, der besteht aus zwei Werten, einer ArtX
die andere vom TypY
. Es sieht wie folgt aus:Für ein Produkt von drei Typen, wir haben nur
P3<A, B, C>
mit der offensichtlichen Dritte Methode. Ein Produkt der drei Listen, dann wird erreicht durch die Verteilung der Liste funktors über das Produkt geben. Also das Produkt vonList<X>
List<Y>
undList<Z>
ist einfachList<P3<X, Y, Z>>
. Sie können dann die Iteration über diese Liste mit einer einzelnen Schleife.Den Funktionale Java Bibliothek hat eine
List
Typ, der das multiplizieren Listen zusammen mit first-class-Funktionen und Produkt-Typen (P2, P3, etc. die ebenfalls in der Bibliothek enthalten).Beispiel:
Ist äquivalent zu:
Weiter mit Funktionalen Java, können Sie
doSomething
erste-Klasse wie folgt. Lassen Sie uns sagendoSomething
gibt einen String zurück:Dann können Sie beseitigen die for-Schleife zusammen, und sammeln Sie die Ergebnisse aller Anwendungen von
doSomething
:InformationsquelleAutor der Antwort Apocalisp
Wenn Sie eine Allgemeine nested-loop-Struktur wie:
wo
i0,i1,i2,...,id
sind loop-Variablen und -d
ist die Tiefe der geschachtelten Schleife.Äquivalente Rekursion Lösung:
Zähler ist ein array der Größe
d
die die entsprechenden Variableni0,i1,i2,...id
bzw.int counters[d]
.Ähnlich wie wir Sie wandeln können andere Variablen, wie z.B. die Initialisierung der Rekursion oder endet, durch die Verwendung von arrays für Sie, d.h. wir hätten
initial[d], ending[d]
.InformationsquelleAutor der Antwort Deepak Sharma
Den Preis für das schönste Allgemeinen Ansatz, ich könnte kommen mit in Java 7 ist
Oder in Java 8:
Eine Implementierung, die dies unterstützt ist:
InformationsquelleAutor der Antwort Michael Anderson
Schafft eine schöne verschachtelte for-Schleife Skelett 😉
Nicht ganz ernst und ich bin mir bewusst, dass eine rekursive Lösung gewesen wäre eleganter.
InformationsquelleAutor der Antwort Michael Kutschke
Beispiel nennen:
InformationsquelleAutor der Antwort gewizz
meine erste Zeit mit der Beantwortung einer Frage, aber ich fühlte, wie ich brauchte, um zu teilen dieser info
der
`
gleichwertig zu
also, wenn Sie wollte, eine n-Zahl von Nestern, es kann geschrieben werden mit division zwischen
base
undloop
so könnte es Aussehen, etwas so einfaches wie das hier:also, wenn Sie wurden zu geben
printer(10, 2);
es würde ausdrucken:InformationsquelleAutor der Antwort user3239534
Im Interesse der Prägnanz ich Stelle meinen code hier :
Ausgabe
InformationsquelleAutor der Antwort Ajeet Ganga