[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