Newsgroup: it.comp.java
Titolo: hashtable... oppure???

Salve a tutti!!!
Ho un bean con scope "application" il quale deve mantere in pancia una
serie di dati.
Per fare questo mi servo di una hashtable alla quale passo una chiave ed
un oggetto.
Questa chiave č cosě composta:
id1.id2.id3
quindi la mia hashtable viene riempita come segue:
  key=id1+"."id2+"."id3;
  myHT.put(key,new myObj());
Il problema č che io vorrei poter riavere questo myObj passando la
chiave id1.id2.id3 (e fin qui tutto ok), ma anche passando solo id1.id2
oppure solo id1!!!
Devo per forza avere 3 hashtable distinte oppure c'č un oggetto che mi
consente di fare ciň che desidero?!?!?
Spero di non essere stato contorto!
Grazie a tutti anticipatamente!!!
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 consente di fare ciň che desidero?!?!?
Vorrei capire meglio. Cosa vorresti ti venisse restituito accedendo con 
chiave id1.id2? L'insieme di tutti gli oggetti che hanno queste due 
chiavi indipendentemente dal valore di id3?
Andrea Polci

 Andrea Polci
Esatto!!!
Oppure indipendentemente da id2 e id3



Ti conviene implementare un oggetto che rappresenti la tua chiav, dove
andrai a ridefinire il metodo equals, ovviamente.
Ma non basta: a quel punto, visto che l'oggetto che ti restiuisce il metodo
get č del tipo che hai caricato ( myObj ) dovresti eventualmente estendere
Hashtable ed inserire un metodo ad esempio: getSottoInsieme  al quale passi
la chiave e che ti restiuisce un Hashtable che ha solo gli elementi che
desideri, ossia quelli definiti dalla logica con la quale ridefinisci il
metodo equals della chiave.
Ciao


Potresti usare  ht che per ogni id1 ha associato una ht che per ogni id2 
ha una ht che per ogni id3 ha un oggetto...
Non so se č questo che intendevi per usare 3 hashtable...
Es. (te lo faccio con id1 e id2 fissati.... ma riscorsivamente lo puoi 
fare per id1 fissato.)
per fare la put
	keyShort=id1+id2; //scusa ma per la fretta ometto ".";
	myHT.put(keyShort, new HashTable());	
	((HashTable)myHT.get(keyShort)).put(id3, new MyObj());
//Adesso per avere una oggetto id1+id2+id3
	MyObj myObj=(MyObj)((HashTable)myHT.get(id1+id2)).get(id3);
 
//Adesso per avere una serie di oggetti id1+id2
	Iterator i  = ((HashTable)myHT.get(id1+id2)).values().iterator();
Scorri l'iterator e hai tutti gli oggetti id1 +id2.
Potresti fare anche una classettina che implementa tutte queste 
funzionalitŕ in maniera trasparente cosě non diventi scemo.
Svantaggi: Codice poco chiaro e difficile da gestire.
Vantaggi: non c'č nessun confronto if then else.
Jnico.

 Oppure indipendentemente da id2 e id3
Ho mandato un messaggio in cui proponevo un'idea. Meglio cosi' perche' 
mi sono accorto di aver fatto un errore madornale e che l'idea e' 
completamente sballata. Non tenerne conto nel caso il messaggio dovesse 
arrivare.
Secondo me l'unica soluzione sensata e' quella delle tre hashtable. 
Magari puoi costruire una classe che gestisca le hashtable assicurandosi 
che siano sincronizzate e utilizzando quella giusta in base a quali id 
stai utilizzando per la ricerca.
Andrea Polc


Attenzione, se ridefinisci equals devi ridefinire anche hashCode, 
altrimenti rompi il contratto di Object.hashCode(oggetti uguali devono 
avere lo stesso hash code!) e impediresti al tuo oggetto di funzionare 
correttamente con una hash-based collection.
Marco

A questo punto mi conviene avere 3 ht distinte e via!
Con 3 metodi get(), in cui cambio solo la signature:
public Enumeration get(String s_ID1){}
public Enumeration get(String s_ID1, String s_ID2){}
public Enumeration get(String s_ID1, String s_ID2, String s_ID3){}
O no???


 
si, ma li devi sincronizzare tra loro.