Aktuelle Zeit: 24.09.2020 11:11

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Eine Liste rückwärts durchlaufen
BeitragVerfasst: 31.07.2020 08:10 
Offline

Registriert: 19.10.2014 15:51
Ich habe eine Liste erstellt: Liste()

Diese kann ich mit :
Code:
ForEach Liste()
debug Liste()\Eintrag
next


Ich möchte die Liste aber rückwärts durchlaufen.
Mit For / Next geht das so:
Code:
For i=1 to 100 step -1
debug i
next i


Aber wie mache ich das mit ForEach?

_________________
Ich programmiere plattformunabhängig und suche immer Lösungen für alle Plattformen.
Win 7/10, Linux Mint Cindy 3 (Debian), Mint 18.3 / 19.1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Liste rückwärts durchlaufen
BeitragVerfasst: 31.07.2020 08:20 
Offline
Benutzeravatar

Registriert: 29.08.2004 08:37
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Liste rückwärts durchlaufen
BeitragVerfasst: 31.07.2020 08:43 
Offline

Registriert: 19.10.2014 15:51
Das probiere ich gerade, aber ich bekomme es nicht hin.
Kannst du mir bitte ein kleines Beispiel geben?

_________________
Ich programmiere plattformunabhängig und suche immer Lösungen für alle Plattformen.
Win 7/10, Linux Mint Cindy 3 (Debian), Mint 18.3 / 19.1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Liste rückwärts durchlaufen
BeitragVerfasst: 31.07.2020 09:25 
Offline
Benutzeravatar

Registriert: 27.12.2005 17:35
Wohnort: Linz, Österreich
Hallo stevie1401
Code:
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 16.04
PB 5.43
Core2 Duo 2x2400Mhz


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Liste rückwärts durchlaufen
BeitragVerfasst: 31.07.2020 10:25 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Mit SelectElement() geht es zwar, aber verspielt die Geschwindigkeit von LinkedLists. Die optimierte Variante wäre diese hier:
Code:
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:
LastElement(Test())
Repeat
   Debug Test()
Until Not PreviousElement(Test())

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Liste rückwärts durchlaufen
BeitragVerfasst: 31.07.2020 10:52 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
Ich mache das i.d.R. so (Variante von NicTheQuicks erstem Beispiel):

Code:
NewList Test.i()

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

e = LastElement(Test())
While e
   Debug Test()
   e = PreviousElement(Test())
Wend

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Liste rückwärts durchlaufen
BeitragVerfasst: 31.07.2020 10:56 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Cool wäre es natürlich, wenn es damit funktionieren würde:
Code:
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:
ResetList(Test())
While NextElement(Test())
   Debug Test()
Wend

Warum also nicht rückwärts? :D

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Liste rückwärts durchlaufen
BeitragVerfasst: 31.07.2020 11:17 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
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:
SortStructuredList(myList(), #PB_Sort_Descending, OffsetOf(MY_STRUCT\index), TypeOf(MY_STRUCT\index))


Und, voila, schon kannst du mit
Code:
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!

_________________
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.


Zuletzt geändert von diceman am 31.07.2020 11:28, insgesamt 6-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Liste rückwärts durchlaufen
BeitragVerfasst: 31.07.2020 11:19 
Offline

Registriert: 19.10.2014 15:51
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 plattformunabhängig und suche immer Lösungen für alle Plattformen.
Win 7/10, Linux Mint Cindy 3 (Debian), Mint 18.3 / 19.1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Liste rückwärts durchlaufen
BeitragVerfasst: 31.07.2020 11:35 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
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.

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye