Newsgroup: it.comp.lang.visual-basic
Titolo: Togliere gli elementi duplicati in un array

Ciao, avrei bisogno di un consiglio
Mediamente lavoro con array di circa 500-600 elementi (con caratteri
alfanumerici). Io avevo pensato di "clonare" lo stesso array e con 2 cicli
scorrere prima il primo vettore e controllare ogni elemento di questo con
tutti quelli del secondo vettore; usare tipo un flag per verificare se un
elemento è presente più di 2 volte (uno stesso elemento in fatti può essere
presente anche più di 10 volte) e una volta verificato questo cancellare (o
tenere) l'elemento duplicato... però mi sembra lenta come soluzione, almeno
così a pensarci; eventualmente qualcuno di voi si è già scontrato con un
simile problema e ha la soluzione a portata di mano?
grazie a tutti quelli che mi risponderanno,
michele

tenere) l'elemento duplicato...
Puoi usare una collection: non permette l' inserimento di chiavi uguali
e se l'accesso agli elementi e' prevalentemente casuale, cioe' non
devi attraversarla in modo lineare dal primo all' ultimo, potrebbe anche
essere piu' performante dell' array.
-- 
hth, hal

 ha scritto nel messaggio
news:ankqr0$fcfef$1...@ID-56381.news.dfncis.de...


 >
si, viene dato errore se provo ad inserire una chiave già presente, come
controllo andrebbe già bene ma non si riesce a gestire bene l'errore... (nel
senso, se mi dai questo determinato errore allora prova ad inserire
l'elemento successivo e così via...) ci vorrebbe qualcosa del tipo
if elemCorrente not in MyColl then inseriscilo
è possibile? sarebbe la soluzione al mio problema :)
ciao, mik

 l'elemento successivo e così via...) ci vorrebbe qualcosa del tipo
On error GoTo GestioneErrori:
[...] 'INSERIMENTO DEI DATI
Exit sub
GestioneErrori:
select case err.number
case (numero dell'errore chiave duplicata nella collection)
Resume Next
case else
msgbox err.number & " " & err.description,48,"Errore"
end
end select
scritto a mano, a memoria fuori dall'IDE
In questo modo grazie al Resume Next se un'elemento è duplicato non viene
inserito.
Non è il massimo della vita, nel senso che a me per primo non piace come
sistema, però funziona.
Spiegami perchè non dovrebbe andare...


azz funziona alla grande... il fatto č che ero convinto che con resume next
l'elemento venisse ugualmente inserito, invece č proprio il contrario!
una soluzione un pň sporca č vero ma poco importa, per quello che deve fare
va piů che bene!! ;-)
grazie mille,
mik

Michele:
  questo e' un problema che mi capita spesso di dover affrontare.
Normalmente uso la routine che ti allego: se poi non ti importa
di "distruggere" il vettore originale la puoi facilmente modificare
per lavorare "in place" (direttamente su dV(), anziche' farne la copia
in dVT()), come pure, credo, non dovresti aver problemi a lavorare
con vettori di qualsiasi tipo (stringhe, interi, etc...).
Ciao, sperando che quanto sotto possa servirti.
Franco
P.S. se non usi VB6 devi ritornare il vettore dVt() come
     argomento di una Sub e non come risultato di una Function.
----------------------------------------------------------------
Public Function Decima(dV#(), Optional ByRef lNV&) As Double()
'
'   Ritorna un vettore con gli elementi di dV()
'   ma senza i doppioni.
'   lNV e' il numero degli elementi rimasti:
'
    Dim I&, J&, Il&, Iu&, K&, dVT#()
'
    Il = LBound(dV)
    Iu = UBound(dV)
    I = Il - 1
    dVT() = dV()
'
    Do
        I = I + 1
        J = I + 1
        Do While J <= Iu
            If dVT(I) = dVT(J) Then
                For K = J To Iu - 1
                    dVT(K) = dVT(K + 1)
                Next K
                Iu = Iu - 1
            Else
                J = J + 1
            End If
        Loop
    Loop While I < Iu
'
    lNV = Iu - Il + 1
    ReDim Preserve dVT(Il To Iu)
'
    Decima = dVT()
'
'
'
End Function

 opportunità per farlo ;-)
Dai un occhio sul sito comune (vedi firma) e cerca "collection":
adXCollection ti dà un controllo decisamente maggiore e è spesso più veloce
delle collection VB.
P.S.: ci sto rimettendo mano per completarlo :P
Ciao
--
' // Initialize the expression evaluator
Engines.Evaluator = CreateObject("
http://www.neodatatype.net
")
' // you can find resources for and from the NG here!
Me.SitoComune = "
http://www.it-lang-vb.net
"

         Loop
Funziona, ma non mi sembra molto performante. Se ti capitano 3 elementi da
"decimare" all'inizio dell'array, ti costa molto meno tempo fare un semplice
loop in tui ti copi solamente gli elementi da tenere in un array nuovo.
In alternativa, se non ti interessa mantenere l'ordinamento, sarebbe più
veloce semplicemente sostituire l'elemento da "decimare" con l'ultimo
elemento dell'array e alla fine fare un redim eliminando tutti gli elementi
in fondo.
Altra possibilità è crearsi un array di puntatori agli elementi da salvare,
e utilizzare quello per le elaborazioni successive.
Ciao
*Roby*

 delle collection VB.
Errata sorrige : adXCollct.zip

Innanzitutto grazie a tutti per l'interessamento, è bello poter contare su
gente in gamba quando se ne ha bisogno!!!!!
Alla fine ho risolto il problema con la collection standard di MS, sembra
accettabile come tempi di elaborazione; appena riesco però mi guardo anche
la tua adXCollct, se il capo fa storie sui tempi avrò ancora un'ultima
chance per migliorare l'applicativo ;-)
CIAO E ANCORA GRAZIE!
michele
"Gigio2K" <barone.fab...@M.libero.it.invalid> ha scritto nel
messaggio news:I%Ln9.54575$e31.1...@twister2.libero.it...
