Newsgroup: it.comp.lang.delphi
Titolo: Struttura dati più adatta?

Devo riprendere in mano un vecchio progetto, e siccome sono un po' 
arrugginito vorrei un vostro consiglio.
 
Ho un file di testo che devo caricare in memoria, contenente tutti gli 
sconti di un cliente, con l'associazione famiglia / sconto 1 / sconto 2 
/ sconto 3.
Questo file deve restare in memoria per far sì che tutti i listini 
generici che vengono caricati nel programma (sempre tramite file di 
testo) vadano a cercare eventuali sconti in questo elenco, tramite la 
famiglia dell'articolo, così da visualizzare poi il prezzo già scontato.
 
Ovviamente mi farete l'osservazione che tutto questo sarebbe molto più 
semplice da gestire con un database e/o un clientdataset, purtroppo non 
ho abbastanza tempo per riscrivere la logica dell'applicazione.
La logica di caricamento del listino è stata scritta anni fa, e vorrei 
tenerla così (non uso clientdataset ma un thread che carica in maniera 
asincrona il listino in memoria creando un semplice array di dati).
 
La domanda, in sostanza, è: come salvereste in memoria gli sconti in 
modo che successivamente, durante (o dopo) il caricamento del listino, 
la ricerca tramite famiglia sia il più veloce possibile?
 
-- 
Jax

 la ricerca tramite famiglia sia il più veloce possibile?
 
Potresti indicizzarli con un dizionario. Vedi questo esempio:
http://docwiki.embarcadero.com/CodeExamples/XE7/en/Generics_Collections_TDictionary_%28Delphi%29
 
 
-- 
MARCO BREVEGLIERI (Software and Web Developer)
#Home: 
http://bit.ly/marcobreveglieri
 
#Blog: 
http://bit.ly/compilaquindiva
 

 Potresti indicizzarli con un dizionario. Vedi questo esempio:
 
Ho dimenticato anche le regole più elementari del NG: uso Delphi 7.
 
-- 
Jax


Puoi provare con la TStringList, che e' la cosa piu' simile
ad un dizionario che puoi trovare in D7.
 
se imposti Sorted:=true la ricerca avviene in modo piu' rapido
facendo una ricerca binaria invece che lineare.
 
ciao
Giacomo
 
 

 facendo una ricerca binaria invece che lineare.
 
Secondo me non va troppo bene, si dovrebbe capire come viene salvato il dato 
nel file di testo.
Se per caso e' piu' o meno cosi'
 
Famiglia1
5
10
15
Famiglia2
3
5
10
 
quando viene ordinata il tutto si mischia, se invece e' piu' o meno cosi'
 
Famiglia1;5;10;15
Famiglia2;3,5;10
 
allora potrebbe funzionare (anche se l'uso di indexof per cercare una 
stringa richiede la totalita' della stringa, in altre parole non ricerca 
parti di stringa).
 
Se rientra nel primo caso si potrebbe ricorrere ad un ini file dove il nome 
del cliente/famiglia rappresenta l'inizio della sessione.
Poi c'e' anche da considerare la dimensione di questo file di testo 
..........
 
ciao
 
Daniele
 

Ciao Daniele,
 
D> Secondo me non va troppo bene, si dovrebbe capire come viene salvato
D> il dato
D> nel file di testo.
 
Semplicizzo...
 
TSconti = class
  Sconto1, Sconto2, Sconto3: Extended;
end;
 
Con le nuove versioni di Delphi, può utilizzare un TDictionary<string, TSconti>.
 
In Delphi 7 può utilizzare una TStringList dove andrà ad aggiungere i dati 
con AddObject('Famiglia', Sconti); a questo punto andrà a richiamare IndexOf('Famiglia') 
e a utilizzare l'oggetto TSconti associato alla riga trovata in questo modo: 
TSconti(StringList.Objects[Index]).
 
Puoi dare un'occhiata al codice qui:
 
http://stackoverflow.com/questions/8947400/tstringlists-addobject-method
 
 
HTH,
David
 
 

 
http://stackoverflow.com/questions/8947400/tstringlists-addobject-method
 
 
Ok, grazie 1000... più o meno è quello che faccio già ora per l'elenco 
articoli, solo che invece che a una stringlist ho associato gli oggetti 
alla ListView stessa. Creerò una stringlist per le famiglie, sperando 
che tutta quella roba in memoria non occupi troppo... ma non dovrebbe, 
visto che sono solo 4000 righe in più.
 
 
-- 
Jax