Newsgroup: it.comp.lang.visual-basic
Titolo: Doppio ordinamento: quale algoritmo ?

Vorrei ordinare un elenco di voci 
discendentemente
in base ad una cifra
ed in caso di parità di voci
far scattare un secondo ordinamento
per alfabeto
--  --   --
Faccio un esempio che spiega meglio:
Rossi Aldo  5
Rossi Bebo  9
Rossi Carlo 3
Bianchi Andrea   7
Bianchi Dario    3
Bianchi Tiziano  9
Verdi  Antonio   1
Verdi  Daniele   8
Verdi  Vittorio  3
La famiglia più vecchi (la cui età sommata risulta più grande)
deve stare in cima
e poi
all'interno della famigliola i nomi dovrebbero 
essere ordinati alfabeticamente
(ordinamento alfabetico che già ho in partenza per la verità,
quindi si tratterebbe solo di spostare la famigliola in blocco
perchè appunto l'ordinamento alfabetico al loro interno già c'è...)
Quindi così dovrebbe risultare:
Bianchi Andrea   19
Bianchi Dario    19
Bianchi Tiziano  19
Rossi Aldo  17
Rossi Bebo  17
Rossi Carlo 17
Verdi  Antonio   12
Verdi  Daniele   12
Verdi  Vittorio  12
Nota1:
come ordini di grandezze,
ho 120 famiglie e
ogni famiglia ha 200 persone
quindi in totale circolano 24000 persone circa
Nota2:
per la verità sono in NET, e non so se c'è
una qualche funzione che faccia questo;
le 24 voci stanno in un array bidimensionale
Dim miaArray (1,23999) as String

teo ha scritto:

La butto li, magari è poco pratica, ma se metti tutto in una tabella
di Access riesci, con SQL, a fare tutto quello che dici con pochissimo
codice....!
Ho detto Access solo perchè per quello che serve a te può essere
fin troppo....
@Alex

 fin troppo....
Se lavora con 
vb.net
 basta una DataTable.
Ciao 

 Ciao
Si non ci avevo nemmeno pensato, .NET è ancora fuori dalla mia vita,
ad essere
sincero però già con ADO sarebbe stato possibile eseguire un RS in
memoria
ed ottenere la stessa cosa....!
P.S. Scusa se ti disturbo Fabio, il DCOM di cui parlavamo, ritieni che
possa
pubblicarlo nel mio sito o preferisci di no...?
Se si, dimmi con quali modalità...
Grazie
@Alex

 Se si, dimmi con quali modalità...
mmm... ma l'hai provato?
Funziona?
Se proprio lo vuoi pubblicare lasciami cambiargli qualche nome, anche se non 
è il caso non vorrei avere strane storie con la mia ditta alla quale avevo 
proposto questo mio lavoretto per risolvere un problema.
Ciao 

rispondo ad entrambi,
non è tanto la fattibilità
è il tempo impiegato
(alla quale in effetti non avevo fatto menzione):
entrare in un db o datatable, ordinare,
e restituire non risulta più lento di lavorare con algoritmo?
L'algoritmo si riesce a farlo:
direi un ciclo maggiore per le 24000 voci ed al 
cambio di cognome un ciclo più piccolo 
all interno di quel cognome...
è che siccome penso sià tutto sommato un caso
ricorrente,mi domandavo se qualcuno conoscesse
un algoritmo noto (magari ha anche un nome) 
che facesse ciò.
Comunque vedo con un Datatable, 
se vado veloce, vado con quello;
ma l'array e l'algoritmo ben fatto secondo me sono più veloci.


 Ciao
Ciao e grazie a te.
@Alex

 Dim miaArray (1,23999) as String
in net tutti gli array hanno il metodo sort, di cui esistono anche le
varianti in cui gli indichi tu il metodo per il confronto degli
elementi

>Se lavora con 
vb.net
 basta una DataTable.
Avrei delle domande:
ho il DataTable.
Per ordinarlo sono dovuto ricorrere
ad una collezione  miaDRs  di DataRow.
Potevo ordinare e rimanere nella DataTable
senza ricorrere al DataRow?
Il DataTable non mi serve, lo elimino con
mioDataTAble = Nothing  ?
-  -  -
La collezione   miaDRs  di DataRow  č un po' duttile? 
Cioč dovrei:
- eliminare qualche riga,
- eliminare qualche colonna,
- prenderne le prime tot righe,
- recuperare un valore in base a coordinate x,y 
- bindarne una sua colonna ad una ListBox
(le prime 4 operazioni possibilmente senza
ciclare con For Each)
si possono fare?
 

 ha scritto nel messaggio 
news:t0klf2pgm5glaqjpf...@4ax.com...


 - bindarne una sua colonna ad una ListBox
ListBox1.DisplayMember = "Campo2"
ListBox1.DataSource = dv
Ciao

ListBox1.DataSource = dv
Per bindare qui hai usato il DataView,
quindi è l'unica strada, 
se il DataTable non mi subisce l'ordinamento 
ed il DataRow non è bindabile per definizione?

 ed il DataRow non è bindabile per definizione?
Boh, penso ci siano anche altre strade, come ad es. fare la Select e poi con 
un loop riempire una nuova DataTable con le righe ordinate, ma mi pare di 
reinventare l'acqua calda.
Io non mi farei così tante pippe mentali, probabilmente si riuscirebbe anche 
a ordinare direttamente l'array come diceva Elef, ma c'è già tutto pronto... 
le prestazioni su 24000 righe penso siano decisamente trascurabili, senza 
contare che su una DataTable puoi anche definire una chiave primaria per 
velocizzare l'ordinamento.
Ciao 

...nel mio piccolo, ma forse non ho capito tutto su questo argomento, 
creerei un oggetto "Famiglie" con le tre proprietā che ti servono e poi 
implementerei un'interfaccia IComparable. A questo punto con un semplice 
array di "Famiglie" puoi fare tutto tramite il metodo Sort. Con 
IComparable sei tu che indichi i vari metodi di confronto per 
l'ordinamento degli oggetti.
Ciao, Morrie
P.S. Se ti serve posso postarti del codice come esempio (da quando ho 
scoperto le interfacce sono un uomo pių felice... :-) )

scoperto le interfacce sono un uomo più felice... :-) )
non è che hai una interfaccia anche per eliminare un elemento
da un array multidimensionale?
L'unico modo è di ciclare dall'elemento in questione
spostando su di un livello tutti gli elementi sottostanti.
(invece di fare ciò, cioè ciclare e spostare si potrebbe 
usare il metodo Copy da N elelemto a M elemento per 
muovere gli elementi in blocco,
ma funziona solo per quelle monodimensionali; 
il Balena 2003 pag 237 verso metà pag, è un po' criptico a riguardo).

 
Purtroppo non è che io abbia delle interfacce nascoste, uso quelle del 
framework... :-)
Se ti riferisci sempre all'array di famiglie che vuoi utilizzare puoi 
usare sempre la Collection che ti crei con il codice che ti ho postato. 
Essendo una collection in piena regola hai tutti i modi quali "RemoveAt" 
  ed "Insert"...
Se sono stato poco chiaro fammelo sapere...
Ciao, Morrie

Cosa succederebbe se le variabili che  rappresentano le singole
persone contenessero i dati in questo modo:
19 Bianchi Andrea
19 Bianchi Dario
19 Bianchi Tiziano
17 Rossi Aldo
17 Rossi Bebo
.............
12 Verdi Vittorio
Forse sarebbe sufficiente in qualsiasi algoritmo di ordinamento in
una semplice matrice monodimensionale!
Alessandro
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Prova di ordinamento eseguita su 24000 variabili generate casualmente 
in una manciata di secondi.
