sort a tlist

BlitzMax Forums/BlitzMax Programming/sort a tlist

boomboommax(Posted 2005) [#1]
k, i have a tlist called displaylist

eg:
For Local d:displayimage = EachIn displaylist
next

each displayimage has an x and y, i need to insert the current displayimage before the last if the x or y are lower than the prev displayimage`s values.

ive had a search around but it seems overly complicated for what was such a simple thing todo in b3d etc.

any ideas?


tonyg(Posted 2005) [#2]
Won't you need InsertAfterLink or InsertBeforeLink?


boomboommax(Posted 2005) [#3]
dont seem to work?


boomboommax(Posted 2005) [#4]
		Local tmpimage:displayimage
		Local tmpx:Int,tmpy:Int
		
		For Local d:displayimage = EachIn displaylist
			If tmpimage
				If d.x < tmpimage.x Or d.y < tmpimage.y
					'insert d before tmpimage here,... but how?
				EndIf
			EndIf
			
			tmpimage = d
			
			tmpx = d.x
			tmpy = d.y
		Next



tonyg(Posted 2005) [#5]
This should help.
Links


boomboommax(Posted 2005) [#6]
-below post-


boomboommax(Posted 2005) [#7]
seems a bit... slow?, i basically need to sort the displayimages based on the y location, so they draw in order,

		Local tmpimage:displayimage
		Local tmpx:Int,tmpy:Int
		
		Local zupdate:Byte
		
		For Local d:displayimage = EachIn displaylist
			zupdate = False
			
			If tmpimage <> Null
				If d.y < tmpimage.y
					zupdate = True
				'ElseIf d.x < tmpimage.x
				'	zupdate = True
				EndIf
				
				If zupdate
					displaylist.remove(tmpimage)
					displaylist.insertafterlink(tmpimage,displaylist.findlink(d))
				EndIf
			EndIf
			
			tmpimage = d
			
			tmpx = d.x
			tmpy = d.y
		Next



N(Posted 2005) [#8]
Type DisplayImage
    Field X:Int
    Field Y:Int

    Global List:TList = New TList
    
    Method Compare( other:Object )
        Local i:DisplayImage = DisplayImage( other )
        If X < i.X Or Y < i.Y Then Return -1
        Return 0
    End Method

    Method New( )
        List.AddLast( Self )
    End Method
End Type


Something like this?


tonyg(Posted 2005) [#9]
Something like this?
Strict

Type test
	Field link:TLink
	
	Field a:Int
End Type

Local list:TList = New TList

For Local i:Int=1 To 8
	Local t:test = New test
	t.a = i
	t.link = list.AddLast(t)
Next

Local j:test = New test
j.a = 5
Local done:Int
For Local t:test=EachIn list
    If done=0
		If t.a > j.a
			list.insertbeforelink(j,t.link)
			done=1
		EndIf
    EndIf
Next

For Local t:test=EachIn list
	Print t.a
	Print
Next


Not sure of a better way to exit a for/eachin loop.
Exit seems to exit without doing the insert.


boomboommax(Posted 2005) [#10]
its sorted now, just override the compare method and call sortlist, worked out good.


tonyg(Posted 2005) [#11]
Can you show the code?


levent(Posted 2005) [#12]
Here is an example using Compare
Type Person
	Field name:String
	Field age:Int
	
	Function create:Person(name:String, age:Int)
		Local temp:Person = New Person
		temp.name=name
		temp.age=age
		Return temp
	End Function

	Method Compare(p:Object)
		pr:Person = Person(p)
		If(self.name > pr.name) Then
			Return 1
		Else 
			Return 0
		End If
	End Method	
	
	Method ToString:String()
	   	Local str:String
	   	str :+ "~nName:"+name+" Age:"+age
		Return str
	End Method
End Type

Type People Extends TList
	
	Method add(p:Person)
	  AddLast(p)
	End Method
	
	Method SortByName()
		Sort()
	End Method
	 
  	Method ToString:String()
		Local str:String
		For Local p:Person=EachIn Self
			str :+ p.ToString()
		Next
		Return str
  	End Method	
End Type

'===============================
'  main 
'===============================
p1:Person = Person.create("John",21)
p2:Person = Person.create("Adam",35)
p3:Person = Person.create("Michael",67)

p:People = New People

p.add(p1)
p.add(p2)
p.add(p3)
Print p.ToString()
p.SortByName()
Print p.ToString()



Hope this helps.

Levent


taxlerendiosk(Posted 2005) [#13]
	Method Compare(p:Object)
		pr:Person = Person(p)
		If(self.name > pr.name) Then
			Return 1
		Else 
			Return 0
		End If
	End Method

Are you sure that always works? Returning zero means that the two are identical, but what if the string you're comparing to is "less than"? Would it still do the right thing anyway?

This is my attempt to explain it:
Type MySorter
	Field CompareValue:Int
	
	Method Compare(o:Object)
		MS:MySorter = MySorter(o)
		Return (Self.CompareValue - MS.CompareValue)
		' Positive number: The compared object is < this object.
		' Zero:            The compared object is = this object.
		' Negative number: The compared object is > this object.
	End Method

	Function PrintList(MSL:TList)
		PrintStr$ = ""
		For MS:MySorter = EachIn MSL
			PrintStr$ :+ MS.CompareValue + ", "
		Next
		Print PrintStr
	End Function
	
	Function Create:MySorter(CV:Int)
		MS:MySorter = New MySorter
		MS.CompareValue = CV
		Return MS
	End Function
End Type

Local MSList:TList = New TList

For i = 0 To 24
	MSList.AddLast( MySorter.Create(Rand(50)) )
Next

Print "Unsorted:"
MySorter.PrintList(MSList)

MSList.Sort()

Print "Sorted:"
MySorter.PrintList(MSList)