[Gambas-user] A random sort of listview
Simonart Dominique
simonart.dominique at ...11...
Tue Apr 7 03:54:57 CEST 2009
Simonart Dominique a écrit :
> jbskaggs a écrit :
>> I came up with a way to random sort listview. (Iuse this for random
>> shuffling card slots on games) But it isnt efficient some pointers if you
>> dont mind?
>>
>> I use two listviews one to sort from and one to sort to:
>>
>> I first copy all the listitems from list 1 to list 2 EXCEPT the key for
>> listview2 items = the integer from my for next loop
>>
>> eg
>> for i = 0 to listview1.count -1 step 1
>> listview2.add(i, listview1.item.text)
>> next
>>
>> then with a for next loop based on the length of list1 I copy the
>> listview.item key to a string A and listview.item.text to second string B
>>
>> Then I calculate a random number the count of listview2 and add that to a
>> integer C
>> thenadd it to listview2
>> listview2.add("n"&A, B,,C) "n"&A creates a key of n1, n2, etc ...
>>
>>
>> AFter the loop ends
>>
>> I run a second loop
>>
>> and run
>> for i = 0 to listview1.count -1 step 1
>> listview.moveto(i)
>> listview2.item.delete
>> next
>>
>> This gives me a random sorted list in viewlist2 of viewlist1 with no
>> duplicates etc-
>>
>> But is there a more efficient way of doing this?
>>
>> here is total code:
>>
>> PUBLIC SUB button3_click()
>> DIM a AS String
>> DIM d AS Integer
>> DIM e AS Integer
>> DIM i AS Integer
>> DIM c AS Integer
>> listview1.Clear 'clears the list
>> FOR i = 0 TO 199 STEP 1 'number of items to add
>> listview2.Add(i, "Slot" & i) 'adds items to sort to list
>> NEXT 'next item
>> i = 0
>>
>> FOR i = 0 TO 199 STEP 1 'number of items
>> e = 0
>> listview1.MoveTo(i) 'goto item
>> a = listview1.Item.Text 'get text
>> PRINT a
>> d = listview1.Key 'get key
>> PRINT "old key", d
>> listview1.Item.Delete 'delete item (the cut part of cut and paste)
>> e = Round(Rnd(200)) ' make sure old key doesNOT equal NEW Key
>> PRINT e, "<<<< the randomimzed number"
>>
>> IF e >= 200 THEN e = 199
>> listview2.Add("n" & d, "n" & a,, e) 'adds cut items after randomly
>> chosen item
>> listview3.Add("n" & d, "n" & a)
>> PRINT "new key", e
>> NEXT 'next item down
>>
>> FOR i = 0 TO 199 STEP 1 'number of items
>> listview2.MoveTo(i)
>> listview2.Item.Delete
>> NEXT
>>
>> ValueBox1.value = listview1.Count
>> END
>>
>> JB SKaggs
> Hi,
>
> Let say you want to populate an array with 0-199 randomly
> (please note that I write this directly, so check carefully
> the syntax)
>
> dim myArray as integer[200]
> dim A as integer
> dim i as integer
>
> FOR i=0 to 199
> A=int(Rnd(200-i))
> ' I think we could use a Swap instruction
> ' instead of the 2 instructions below
> myArray[i]=A
> myArray[A]=i
> NEXT
>
> That's all
> If these numbers was the keys of the initial Listview you
> just have to populate the second Listview in the new order
>
> Hope this help
> Dominique Simonart
>
>
Well, never write directly like that!!
I make some mistake in my sample, here is a new one:
DIM myArray AS Integer[200]
DIM A AS Integer
DIM i AS Integer
'initialize the array
FOR i=0 TO 199
myArray[i]=i
NEXT
'Randomize the order of the array
FOR i = 199 TO 0 STEP -1
A = Int(Rnd(i + 1))
SWAP myArray[i], myArray[A]
NEXT
More information about the User
mailing list