Listenposition suchen

Für allgemeine Fragen zur Programmierung mit PureBasic.
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Listenposition suchen

Beitrag von True29 »

Hi ,
Folgendes folgender code funktioniert leider noch nicht :(
Er soll mir wenn ich neue elemente in die liste einfüge den dafür besten position in der liste zurückgeben.

hier mal der demo code, lauffähig.
wenn alles richtig wäre musste er mir hier position 0 vorschlagen.
wenn ich nun ein element mit dem wert 0 hinzufüge sollte position 3 bzw 2 kommen.

kurze erklärung zu der structur:
Likes sind praktisch bewertungen für songs , demnach soll der song mit den meisten bewertung ganz oben landen .

hoffe das is so weit verständlich ;)
ihr könnt den code auch gerne optimieren und danke für die Hilfe.

Code: Alles auswählen

;demo sort list

Structure Musicfile
  Likes.i
EndStructure

Global NewList Playlist.Musicfile()


Procedure MusicManager_GetSortPosition(*music.musicfile,List Musiclist.musicfile())  
  Protected Position.i = 0 
  Protected LastElement = ListIndex(Musiclist())

;// get position for song
  ResetList(Musiclist())
  ForEach Musiclist()
    If Musiclist()\Likes < *Music\Likes
      Position = ListIndex(Musiclist())           
    EndIf
  Next
  
  SelectElement(Musiclist(),LastElement)  
  
ProcedureReturn Position
  
EndProcedure

AddElement(Playlist())
Playlist()\Likes = 40

AddElement(Playlist())
Playlist()\Likes = 20

AddElement(Playlist())
Playlist()\Likes = 0



;// get position for last added element
AddElement(Playlist())
Playlist()\Likes = 50
Debug MusicManager_GetSortPosition(Playlist(),Playlist())
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Listenposition suchen

Beitrag von STARGÅTE »

Da du das Element ja schon hingefügt hast, musst du es natürlich bei deiner Untersuchung "ausklammern".
Ein ResetList() ist bei ForEach nicht nötig.
Zum merken von Elementen gibts Push und Pop.

Code: Alles auswählen

;demo sort list

Structure Musicfile
  Likes.i
EndStructure

Global NewList Playlist.Musicfile()


Procedure MusicManager_GetSortPosition(*music.musicfile,List Musiclist.musicfile())  
  Protected Position.i = 0

;// get position for song
  PushListPosition(Musiclist())
  ForEach Musiclist()
    If *music <> @Musiclist() And Musiclist()\Likes > *Music\Likes
      Position = ListIndex(Musiclist())  +1         
    EndIf
  Next
	PopListPosition(Musiclist())  
  
ProcedureReturn Position
  
EndProcedure

AddElement(Playlist())
Playlist()\Likes = 40

AddElement(Playlist())
Playlist()\Likes = 20

AddElement(Playlist())
Playlist()\Likes = 0



;// get position for last added element
AddElement(Playlist())
Playlist()\Likes = 50
Debug MusicManager_GetSortPosition(Playlist(),Playlist())
Ich würde es lieber gleich so machen, dass du erst die Position suchst, und dann einfügst.
Denn so wird ja das neue Element noch nicht verschobene und die Liste ist dann unsortiert.
Und diese Methode geht dann für das 2. neue element nicht mehr.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten