Newsgroup: it.comp.java
Titolo: una TreeMap NON ordinata in inserimento

Ciao a tutti,
nella mia applicazione utilizzo una "Treemap"<String,Dato> di nome
'annata' per raccogliere dei dati,
esempio:
(String indica la data... Lo so che potrei usare Date, ma ancora non
ho fatto le dovute prove)
annata.put("2008-06-06", new Dato(6) );
annata.put("2008-01-01", new Dato(1) );
annata.put("2008-02-02", new Dato(2) );
ecc.. ecc...
La TreeMap farà in modo di inserire tali Dati rispettanto l'ordine
cronologico di ciascuna delle sue chiavi (e quindi: "2008-01-01",
"2008-02-02", "2008-06-06" che è anche il normale ordine cronologico
proprio di queste date)
Tuttavia, ecco il mio problema, l'esecuzione della mia applicazione
non rispecchia tale ordine finale:
la mia applicazione, infatti, fa uso di una classe 'DB' e di un suo
metodo 'leggiXml()' per caricare nella "TreeMap" annata i vari Dati
esempio:
	DB db = new DB();
	annata = db.leggiXml(annata, "VENDITE_anno_2008.xml");
	annata = db.leggiXml(annata, "ACQUISTI_anno_2008.xml");
Come vedete stiamo caricando 2 diverse tipologie di dati, VENDITE ed
ACQUISTI, avvenuti in tutti i giorni dell'anno 2008.. Io vorrei così
poterli caricare tutti insieme nella "TreeMap" annata per poi
scorrerla e vedere l'esatto ordine cronologico in cui sono avvenuti.
"VENDITE_anno_2008.xml" riporta questi dati:
"2008-01-01"; vendita (...di mattoni)
"2008-03-03"; vendita (...di qualcos'altro)
mentre il file "ACQUISTI_anno_2008.xml" riporta questi altri dati:
"2008-02-02"; acquisto (di banane)
"2008-04-04"; acquisto (di capre)
Se li vado a caricare tutti insieme in 'annata' mi aspetto di ottenere
un ordine di output simile a questo:
"2008-01-01"; vendita (...di mattoni)
"2008-02-02"; acquisto (di banane)
"2008-03-03"; vendita (...di qualcos'altro)
"2008-04-04"; acquisto (di capre)
Cioè un ordine che rispetta la cronologia...
...e inceve ecco cosa mi appare
"2008-01-01"; vendita (...di mattoni)
"2008-03-03"; vendita (...di qualcos'altro)
"2008-02-02"; acquisto (di banane)
"2008-04-04"; acquisto (di capre)
Cioè mi viene restituito l'ordine di inserimento degli elementi..
..comportamento in contrasto con l'utilità propria della "TreeMap"
So di essere stato tedioso e di aver postato ZER0 codice e MOLTE
indicazioni varie,
ma se qualcuno di voi è già incappato in tale problema lo prego di
darmi un giusto consiglio.
Io rimango a disposizione per rispondere ad ogni vostro dubbio sia sul
codice che su ogni altra cosa,
e attendo le vostre risposte
Grazie
:)


Punto 1) Usa Date e non String. Se e' una data e' una data, se e' un
carciofo e' un carciofo.
Punto 2) Anche con questo pastrocchio delle String al posto dell Date
dovrebbe funzionare..
t consiglio di lasciar da parte la lettura da file e fare un test con
dati fissi, s enon funziona cosi postalo qui nella sua interessa e ci
do un 'occhiata

Ti ringrazio per la disponibilità..
..ho già provato ad eseguire dei test.. proverò a ri-eseguirli
stavolta utilizzando Date al posto di String
(In realtà vorrei utilizzare proprio String perchè questa non è
proprio una "TreeMap" ..ma è una cosa un po' più avanzata)
Per quanto riguarda il codice non me la sento di postarlo, lo so che
allora dovrei starmene zitto e non coinvolgere gli altri, comunque
grazie per la disponibilità.
:-)

 cronologico di ciascuna delle sue chiavi
No.
Usera' l'ordine _alfabetico_ delle String.
Hai 3 possibilita':
1) Usare Date al posto di String
2) Usare un formato della data per le tue String che sia anche 
alfabeticamente ordinabile (YYYYMMDD)
3) Passare al costruttore di TreeMap un'implementazione di Comparator 
che sia in grado di ordinare cronologicamente le tue String (Hint: 
Trasformale in Date usando SimpleDateFormat e compara i Date)

 > La TreeMap farà in modo di inserire tali Dati rispettanto l'ordine

Ho già provato tutte e 3 queste opzioni, ma niente da fare.. continua
ad ordinare per inserimento! Neanche io capisco il perchè??
 - Non ho ancora provato Date, ma preferisco usare String
 - Uso le stringhe nel formato "aaaa-mm-gg", ma come già detto, ciò
non mi assicura l'ordine alfabetico == cronologico di queste stringhe
 - Avevo già provato a passare al costruttore della TreeMap
l'implementazione di una mia Comparator (sulle stringhe usate come
chiavi), ma l'ordine continuava E continua ad essere per inserimento
Ok ragazzi, se proprio è necessario posso postare il codice...
...comunque non è una "TreeMap" nel vero senso del termine (ecco
perchè l'ho sempre indicata fra virgolette),
ma è una <a href="
http://forum.html.it/forum/showthread.php
?
s=9f6a01c6128b0aea2816c77ac46dca5e&threadid=1200955&perpage=15&highlight=&pagenumber=1">IndexedTreeMap
(vedi pag.2)</a>
Grazie a tutti, ci sentiamo dopo la lezione..
..cioè verso le 20
Ciao e grazie

Allora ragazzi ho capito una cosa..
Voi scandite una treeMap con delle linee di codice simili a queste:
Collection c = NOME_DELLA_TREE_MAP.values();
Iterator itr = c.iterator();
while(itr.hasNext())
System.out.println(itr.next());
mentre io x scandirre una IndexedTreeMap posso usare anche quest'altro
metodo: un ciclo for
String s = "Magazzino di Comiso (RG)"; // IDENTIFICA NELLA
IndexedTreeMap QUALE MAGAZZINO ANALIZZARE
for (int a = 0; a < annata.get( s ).stagione.size(); a++)
System.out.println( annata.get( s ).stagione.get( a ) );
// ... .stagione.get( a ) invoca il metodo toString() della classe
'Dato()'
Ora.. mi sono reso conto che se utilizzo il 2° metodo ( x il quale la
IndexedTreeMap è stata creata ) allora l'output mostra un ordinamento
per inserimento, mentre se utilizzo il 1° metodo allora vedo che
l'output è finalmente ordinato per chiave
:)
Siccome voglio continuare ad utilizzare la IndexedTreeMap allora
implementerò un metodo che, finito di acquisire tutti i dati, scorre
tutte le chiavi/stringhe ordinandole in una lista e poi ripercorre
questa lista ordinata di stringhe e per ognuna di queste trova la sua
classe 'Dato()' associata e la inserisce in una nuova IndexedTreeMap
che verrà ritornata al main()..
In questo modo dovrei riuscire ad avere una struttura dati che posso
scandire sia con il 1° e sia con il 2° metodo e in entrambi i casi
vedrò l'output ordinato per in modo crescente per Chiave.
Ditemi la vostra ragazzi,
a presto e grazie per tutti i consigli che mi avete dato :-)
P.S: correzione.. Non utilizzerò nessuna lista, ma mi basta ordinare
le chiavi nell'arraylist di funzionamento dell'IndexedTreeMap