Seite 1 von 1

Listenposition suchen

Verfasst: 03.08.2014 13:37
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())

Re: Listenposition suchen

Verfasst: 03.08.2014 13:56
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.