Newsgroup: it.comp.lang.visual-basic
Titolo: Ordinare una lista in base, non ad una, ma a DUE variabili

Salve, ho una lista di stringhe che dev'essere ordinata in base a due 
variabili.
Faccio un esempio:
185/60 Pippo
160/70 Romi
185/80 Guizzo
170/55 Mirk
ecc. l'elenco dev'essere ordinato principalmente in base al primo numero 
e secondariamente (ossia in caso di due numeri principali uguali) in 
base al secondo, quello dopo la barra.
Ho già scritto una routine che mi estrae i numeri dalle stringhe 
List1.list(n) e li mette in due variabili: Diam(n) e Largh(n).
Io so scrivere la routine di ordinamento "Shell" che mi ordina in base a 
una variabile, ma come si può fare per fare un ordinamento in base a due?
Incr% = List1.ListCount \ 2
Do Until Incr% < 1
    For I% = Incr% To List1.ListCount - 1
       Tmpd = Diam(I%): Tmpd2 = List1.List(I%)
       For J% = I% - Incr% To 1 Step -Incr%
          If Tmpd >= Diam(J%) Then Exit For
             Diam(J% + Incr%) = Diam(J%)
             List1.List(J% + Incr%) = List1.List(J%)
       Next J%
       Diam(J% + Incr%) = Tmpd: List1.List(J% + Incr%) = Tmpd2
    Next I%
Incr% = Incr% \ 2
Loop
Le stringhe sono poche (qualche centinaio), quindi volendo si può anche 
utilizzare un algoritmo molto più semplice, anche se più lento dello 
Shell. Qualcuno è capace di fare un ordinamento di questo tipo?
Grazie infinite

John ha scritto:
Dimenticavo...
Su Visual Basic 6.0

 ha scritto nel messaggio
news:c5pptu$cvv$1...@lacerta.tiscalinet.it...
<quoting>
credo che la cosa più rapida ed efficente che puoi fare è memorizzare quei
valori in un ADODB.Recordset disconnesso, senza avere un db fisico. Li salvi
nel recordset, gli applichi un order by e li rileggi.
Non avendo una tabella fisica, devi costruirla run-time ogni volta, ma
trattandosi di due campi solamente non dovresti perdere in prestazioni.....
guarda comunque gli oggetti ADODB.Recordset, ADODB.Field e così via.....
good coding!!!
-- 
Alletun
"Se ti va di spassartela adesso
Prendi il Vettore oggi stesso."
Terre Desolate - Stephen King

Mentre mi apprestavo a riciclare alcuni bit, *John* ha scritto:

La cosa che mi viene in mente subito è quella di fare la somma delle due
variabili ed ordinare in base a quella:
SortVar = Diam(n) * 1000 + Largh(n)
-- 
3st3b4n
www.seber.it
Questo post è stato scritto con bit riciclati.

 SortVar = Diam(n) * 1000 + Largh(n)
Quando ci sono queste idee così semplici e geniali impazzisco!
GRAZZZIIEEEEEE!!!!

 3st3b4n ha scritto:

Chiaramente il * 1000 va bene se il secondo numero (Largh(n)) non è mai
maggiore di 999, altrimenti devi moltiplicare per 10000 se non è mai
maggiore di 9999 e così via...


 170/55 Mirk
Trovo molto furbo il metodo utilizzato da Array.Sort() di .NET.
Praticamente con questa semplice sub si riesce ad ordinare di tutto per un
semplice motivo: accetta come parametro un'interfaccia IComparable, nella
quale sei tu a indicare il criterio di ordinamento.
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 170/55 Mirk
Io per ordinare piccole quantità di dati (non migliaia o centinaia di 
migliaia, ma di meno), uso questo algoritmo:
V(...) è il vettore di dati (Integer, Stringhe, quello che vuoi), MAX è 
l'indice del suo ultimo elemento, 1 il primo;
For I=1 To MAX-1
   For J=I+1 To MAX
     If Vet(I)>Vet(J) Then
        Mom=Vet(I)
        Vet(I)=Vet(J)
        Vet(J)=Mom
     End If
   Next J
Next I
Nel tuo caso dovresti avere V(...) come vettore di record, dove 
V(...).Numero è la frazione (185/60, 160/70, ecc..., calcolata 
ovviamente) e V(...).Nome è il nome della persona.
L'algoritmo andrebbe riscritto in questa maniera:
V(...) è il vettore di Record, MAX è l'indice del suo ultimo elemento, 1 
il primo, Mom una variabile di appoggio di tipo Record;
For I=1 To MAX-1
   For J=I+1 To MAX
     If Vet(I).Numero>Vet(J).Numero Then
        Mom=Vet(I)
        Vet(I)=Vet(J)
        Vet(J)=Mom
     Else
	If Vet(I).Numero=Vet(J).Numero Then
	   If Vet(I).Nome>Vet(J).Nome Then
        		Mom=Vet(I)
	   	Vet(I)=Vet(J)
       		Vet(J)=Mom
	   End If
         End If
     End If
   Next J
Next I
Spero di essere stato chiaro...
:)
-- 
Rivolterò il mondo per trovarlo, e anche se andasse in Indocina uno dei 
nostri starà nascosto in una ciotola di riso pronto a sparargli nel culo.
(Pulp Fiction)

 nel recordset, gli applichi un order by e li rileggi.
Non rispondo per il problema principale del thread ma mi incuriosisce 
questa cosa delal tabella "virtuale".
Potresti spiegarmi meglio, pls?
Una volta che dichiaro:
Dim RS as ADODB.Recordset
e che faccio:
Set RS=New ADODB.Recordset
come faccio dopo a infilarci dentro dei valori?
Magari anche un URL con un esempio mi sta bene...
Thx in anticipo!


 wrote in message c5pptu$cvv$1...@lacerta.tiscalinet.it...
