2. Im Dokument gibt es ein Feld mit einem Flag der zum Suchen des nächsten Dokuments genommen wird. Wenn ein Dokument gefunden wird, muss im gefundenen wieder das Flag-Feld ausgelesen werden und da nächste Dokument gesucht werden. usw....
Ich finde deinen Gebrauch von flag hier ein bischen irreführend oder ich verstehe die nicht vorliegende Anwendung nicht. Es handelt sich wohl eher um "Pointer" auf die "nächsten Dokumente". Flag ist für mich irgendwie binär. Flag gesetzt oder nicht. Wahr oder Falsch.
Meine Frage ist jetzt: Wie kann man eine Schleife programmieren, wenn ich nicht weis wie oft sie durchlaufen wird.
Wie schon angemerkt, schreit dieses Problem nach einer rekursiven Lösung.
Rekursion kommt relativ häufig vor. V.a. bei solchen Baum-artigen Datenstrukturen.
Schaue es dir auf jeden Fall im Debugger gut an.
Ein Problem hast du bei Rekursion immer, wenn zirkuläre Referenzen möglich sind. Dann kann es zu einer Art Endlosrekursion kommen.
Beispiel:
Struktur 1: Doc-Blau referenziert Doc-Grün und Doc-Gelb
Struktur 2: Doc-Grün referenziert Doc-Rot
Struktur 3: Doc-Rot referenziert Doc-Blau (PROBLEM!)
Struktur 4: Doc-Gelb referenziert NICHTS
Du hast jetzt die folgenden Pseudo-Code-Funktion rekursiv:
function processWorkflowTree(Document doc) {
// do Stuff
Collection col = doc.getNextInWorkflow("fieldName");
if (col.count > 0) {
docNext = col.getFirstDocument()
while not (docNext is Nothing) {
processWorkflowTree(docNext); // REKURSIVER Aufruf !!!
set docNext = col.getNextDocument();
}
}
Wenn man das durchlaufen lässt, wird bei Struktur 3 wieder doc-Blau gefunden und das ganze fängt ewig von vorne an.
Man kann sich aber davor schützen. wenn du dir ausserhalb der rekursiven Funktion - also z.B. in einer globalen Variable - dir alle document merkst, die bereits bearbeitet worden sind.
Rekursion muss man einfach mal gemacht haben. Dann ist es garnicht mehr so schwierig. Schaue es dir auf jeden Fall gut im Debugger an.
Eine aufrufende Routine ruft sich selber als aufgerufene Routine auf. Sobald die aufgerufene Routine abgearbeitet ist, geht der "Kontext" wieder zurück auf die aufrufende Routine.
Poste bis Sonntag mal ein Beispiel.
Rekursion begegnet mir relativ oft bei Baumstrukturen:
- xml/xslt
- Tree(?) in swt oder JTree in Swing, d.h. Gui-Widgets die so aussehen wie die rechte Seite im Windows-File Explorer.
Gruß Axel