Eine Liste rückwärts durchlaufen

Anfängerfragen zum Programmieren mit PureBasic.
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Eine Liste rückwärts durchlaufen

Beitrag von stevie1401 »

Ich habe eine Liste erstellt: Liste()

Diese kann ich mit :

Code: Alles auswählen

ForEach Liste()
debug Liste()\Eintrag
next
Ich möchte die Liste aber rückwärts durchlaufen.
Mit For / Next geht das so:

Code: Alles auswählen

For i=1 to 100 step -1
debug i
next i
Aber wie mache ich das mit ForEach?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Eine Liste rückwärts durchlaufen

Beitrag von DarkDragon »

Geht leider nicht. Früher gab es ForEach nicht mal, da musste man mit While NextElement(Liste()) arbeiten. Dasselbe kannst du mit PreviousElement(Liste()) rückwärts machen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Eine Liste rückwärts durchlaufen

Beitrag von stevie1401 »

Das probiere ich gerade, aber ich bekomme es nicht hin.
Kannst du mir bitte ein kleines Beispiel geben?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Waldixxl
Beiträge: 108
Registriert: 27.12.2005 17:35
Wohnort: Linz, Österreich

Re: Eine Liste rückwärts durchlaufen

Beitrag von Waldixxl »

Hallo stevie1401

Code: Alles auswählen

NewList Test.l()

For i=1 To 10
  AddElement(Test())
  Test()=i
Next

For i=9 To 0 Step-1
  SelectElement(Test(),i)
  Debug Test()
Next
So könnte geht's, wenn ich dich richtig verstanden habe.
LG. Walter
Lesen bei schlechten Lichtverhältnissen ist nicht schlecht für die Augen, sondern trainiert sie sogar.

Linux Ubuntu Mate 18.04
PB 5.71
Intel i5
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Eine Liste rückwärts durchlaufen

Beitrag von NicTheQuick »

Mit SelectElement() geht es zwar, aber verspielt die Geschwindigkeit von LinkedLists. Die optimierte Variante wäre diese hier:

Code: Alles auswählen

NewList Test.l()

For i=1 To 10
	AddElement(Test())
	Test()=i
Next

If LastElement(Test())
	Repeat
		Debug Test()
	Until Not PreviousElement(Test())
EndIf
Weiß man, dass in der Liste mindestens ein Element ist, kann man sich das If auch sparen. Ich habe es nur der Vollständigkeit halber eingebaut, damit es keinen Fehler gibt, wenn die Liste leer ist. Dann sähe es so aus:

Code: Alles auswählen

LastElement(Test())
Repeat
	Debug Test()
Until Not PreviousElement(Test())
Bild
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Eine Liste rückwärts durchlaufen

Beitrag von Nino »

Ich mache das i.d.R. so (Variante von NicTheQuicks erstem Beispiel):

Code: Alles auswählen

NewList Test.i()

For i = 1 To 10
   AddElement(Test())
   Test() = i
Next

e = LastElement(Test())
While e
   Debug Test()
   e = PreviousElement(Test())
Wend
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Eine Liste rückwärts durchlaufen

Beitrag von NicTheQuick »

Cool wäre es natürlich, wenn es damit funktionieren würde:

Code: Alles auswählen

ResetList(Test())
While PreviousElement(Test())
	Debug Test()
Wend
Immerhin geht es ja auch vorwärts so (das war die Variante bevor es ForEach gab):

Code: Alles auswählen

ResetList(Test())
While NextElement(Test())
	Debug Test()
Wend
Warum also nicht rückwärts? :D
Bild
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Eine Liste rückwärts durchlaufen

Beitrag von diceman »

Ich gehe davon aus, du redest von einer strukturierten Liste, mit Elementen, welche einer Struktur zugeordnet sind ...
Wäre folgendes eine Option für dich (sorry, schreibe von der Arbeit aus, kann also keinen Beispiel-Code posten ...):

Zunächst brauchst du in der übergeordneten Struktur ein gesondertes Feld für den Index, welcher aufsteigend bei Erstellung der Elemente zugeordnet wird.
Also erstes Element = 1, zweites Element = 2, etc.

Dann sortierst du dir die Liste nach dem Index, aber in umgekehrter Reihenfolge:

Code: Alles auswählen

SortStructuredList(myList(), #PB_Sort_Descending, OffsetOf(MY_STRUCT\index), TypeOf(MY_STRUCT\index))
Und, voila, schon kannst du mit

Code: Alles auswählen

ForEach
...
Next
in umgekehrter Reihenfolge durchiterieren.
Um die Reihenfolge wieder umzukehren, benutzt du die Konstante #PB_Sort_Ascending.
Der SortStructuredList-Befehl ist meiner Erfahrung nach ausreichend schnell, und es lassen sich tolle Dinge damit anstellen. :allright:

Viel Erfolg!
Zuletzt geändert von diceman am 31.07.2020 11:28, insgesamt 6-mal geändert.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Eine Liste rückwärts durchlaufen

Beitrag von stevie1401 »

Ah! Wieder etwas dazugelernt.
Aus der Hilfe ist nicht wirklich ersichtlich wie das alles funktioniert.
So ging ich davon aus, dass Lastelement(Liste()) lediglich die Nr des letztens Elements angibt.
Ich habe es immer mit Selectelement(Lasteelement(Liste())) versucht, was nicht funktionierte.

Danke für eure Hilfe!
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Eine Liste rückwärts durchlaufen

Beitrag von Nino »

NicTheQuick hat geschrieben:Warum also nicht rückwärts? :D
Daran habe ich auch schon gedacht. :-)
Ein PB-Befehl wie ResetListAfterLastElement() wäre schön ... aber mit einem kürzeren Namen. ;-)
diceman hat geschrieben:Ich gehe davon aus, du redest von einer strukturierten Liste, mit Elementen, welche einer Struktur zugeordnet sind ...
Wäre folgendes eine Option für dich (sorry, schreibe von der Arbeit aus, kann also keinen Beispiel-Code posten ...):

Zunächst brauchst du in der übergeordneten Struktur ein gesondertes Feld für den Index, welcher aufsteigend bei Erstellung der Elemente zugeordnet wird.
Das ist unnötig umständlich :!:
Einfache, direkte generische Lösungen die mit jeder Art von Liste funktionieren wurden bereits gepostet.
Antworten