OVH Cloud OVH Cloud

Matrice associative

10 réponses
Avatar
Manu
bonjour,
je cherche le meilleur moyen de creer une matrice associative.
tel qu'en php :
$aArray['toto']=1;
$aArray['titi']=2;

je tente avec des Hashtable
Hashtable map = new Hashtable();
map.put("toto",new Vector() );
map.put("titi",new Vector() );

n'existe t il pas un autre moyen ?

le but rechercher, creer une matrice a cle associative contenant un
vector d'objet

manu

10 réponses

Avatar
Rémi Cocula
Manu wrote:

Hashtable fait ça très bien !
Avatar
Manu
Manu wrote:

Hashtable fait ça très bien !
mon autre soucis alors est de quelle maniere recuperer mon vector

si je fais :
Hashtable map = new Hashtable();
map.put("toto",new Vector() );
comment ajouter un element dans "toto" :
map.get("toto").addElement(monObj);

Avatar
Xavier Tarrago
"Manu" a écrit dans le message de
news:41ef6217$0$2187$
Manu wrote:

Hashtable fait ça très bien !
mon autre soucis alors est de quelle maniere recuperer mon vector

si je fais :
Hashtable map = new Hashtable();
map.put("toto",new Vector() );
comment ajouter un element dans "toto" :
map.get("toto").addElement(monObj);


Il vaut mieux utiliser HashMap qui est plus récent. Les fonctionnalités sont
les mêmes, sauf que HashMap n'est pas thread-safe. C'est suffisant dans les
cas classiques et plus rapide.
Pour les mêmes raisons, Vector est obsolete.Il faut utiliser ArrayList (non
thread-safe mais plus rapide).

// stocker
ArrayList vector = new ArrayList();
vector.add(item1);
vector.add(item2);
vector.add(item3);
HastMap map = new HashMap();
map.put(cle1, vector);

// récupérer
ArrayList vector = (ArrayList)(map.get(cle1));
item1 = vector.get(0);

// ou
item1 = (Item)((ArrayList)(map.get(cle1))).get(0);

Notez que avec la version 1.5 de java et la généricité, on put faire (sans
garantie de la syntaxe, je ne la connais pas bien) :

ArrayList<Item> vector = new ArrayList<Item>();
vector.add(item1);
vector.add(item2);
vector.add(item3);
HastMap<Cle, ArrayList<Item>> map = new HashMap<ArrayList<Item>>();
map.put(cle1, vector);

et item1 = map.get(cle1).get(0)


Avatar
Manu
bonjour xavier,
mon probleme est que tout doit "synchronized", multi thread.
donc je ne peux utiliser Hashmap. que faire alors ?
pour ce qui est de vector, obsolete certe mais syncro ! alors que
ArrayList ne l'est pas ! quel est alors le remplacant de vector en syncrho ?


"Manu" a écrit dans le message de
news:41ef6217$0$2187$


Manu wrote:

Hashtable fait ça très bien !


mon autre soucis alors est de quelle maniere recuperer mon vector
si je fais :
Hashtable map = new Hashtable();
map.put("toto",new Vector() );
comment ajouter un element dans "toto" :
map.get("toto").addElement(monObj);



Il vaut mieux utiliser HashMap qui est plus récent. Les fonctionnalités sont
les mêmes, sauf que HashMap n'est pas thread-safe. C'est suffisant dans les
cas classiques et plus rapide.
Pour les mêmes raisons, Vector est obsolete.Il faut utiliser ArrayList (non
thread-safe mais plus rapide).

// stocker
ArrayList vector = new ArrayList();
vector.add(item1);
vector.add(item2);
vector.add(item3);
HastMap map = new HashMap();
map.put(cle1, vector);

// récupérer
ArrayList vector = (ArrayList)(map.get(cle1));
item1 = vector.get(0);

// ou
item1 = (Item)((ArrayList)(map.get(cle1))).get(0);

Notez que avec la version 1.5 de java et la généricité, on put faire (sans
garantie de la syntaxe, je ne la connais pas bien) :

ArrayList<Item> vector = new ArrayList<Item>();
vector.add(item1);
vector.add(item2);
vector.add(item3);
HastMap<Cle, ArrayList<Item>> map = new HashMap<ArrayList<Item>>();
map.put(cle1, vector);

et item1 = map.get(cle1).get(0)






Avatar
Isammoc
Manu écrivait
news:41ef78a7$0$6601$:

bonjour xavier,
mon probleme est que tout doit "synchronized", multi thread.
donc je ne peux utiliser Hashmap. que faire alors ?


hum, Si j'ai bien compris, Hashmap est la version non synchronisé de
Hashtable, donc, il faut utiliser Hashtable dans ton cas.

pour ce qui est de vector, obsolete certe mais syncro ! alors que
ArrayList ne l'est pas ! quel est alors le remplacant de vector en
syncrho ?


Pourquoi un remplacant de Vector, s'il existe?


De maniere générale, la version non synchronisée est plus performante que
la version synchronisée (cause des poses de verrous...) mais les deux ont
le meme comportement lors d'une utilisation mono thread.
Si utilisation des threads il y a, alors l'unique (bonne) facon de faire
est d'utiliser la version synchronisée. Sinon, risque d'empietement...

--
Isammoc

Avatar
Manu
j'utilise ca :
((Vector)map.get("toto")).addElement(monObjet);


mais le probleme est que j'obtiens un warning :
warning: [unchecked] unchecked call to addElement(E) as a member of the
raw type java.util.Vector
((Vector)map.get("toto")).addElement("test");
^

et je ne sais pas comment annuler ce warning (meme si cela n'est pas
genant en soit)

manu
Avatar
Isammoc
Manu écrivait news:41ef7a6b$0$8009$8fcfb975
@news.wanadoo.fr:

j'utilise ca :
((Vector)map.get("toto")).addElement(monObjet);


mais le probleme est que j'obtiens un warning :
warning: [unchecked] unchecked call to addElement(E) as a member of the
raw type java.util.Vector
((Vector)map.get("toto")).addElement("test");
^

et je ne sais pas comment annuler ce warning (meme si cela n'est pas
genant en soit)


<javadoc>
addElement :

public void addElement(Object obj)
Adds the specified component to the end of this vector, increasing its
size by one. The capacity of this vector is increased if its size becomes
greater than its capacity.

This method is identical in functionality to the add(Object) method
(which is part of the List interface).

Parameters:
obj - the component to be added.
See Also:
add(Object), List
</javadoc>

En résumé, change le addElement en add, ca devrait le faire pareil... Et
(je pense) sans warning.

manu


--
Isammoc
Eh Manu! Tu descends?

Avatar
Hervé AGNOUX
Manu wrote:

bonjour xavier,
mon probleme est que tout doit "synchronized", multi thread.
donc je ne peux utiliser Hashmap. que faire alors ?
pour ce qui est de vector, obsolete certe mais syncro ! alors que
ArrayList ne l'est pas ! quel est alors le remplacant de vector en syncrho
?



Il vaut mieux synchroniser toi même, en te donnant un objet verrou. De
toutes façons les synchronisations sur les Vectors ou HashMaps ne sont pas
forcément appropriées.

--
Hervé AGNOUX
http://www.diaam-informatique.com

Avatar
Xavier Tarrago
Ce warning vient du fait que tu es en version 5 de java (ou 1.5, c'est
pareil). Tu es censé utiliser les templates.
au lieu de Vector, déclare un Vector<TonType> avec TonType = le type de ce
que tu veux mettre dans le Vector.
Supposons que tu veux mettre des String dans le Vector:

Vector<String> v = new Vector<String>();
HashTable<String, Vector<String>> h = new HashTable<String,
Vector<String>>();
h.put("mot 1", v);
h.get("mot 1").add("définition 1 du mot 1");
h.get("mot 1").add("définition 2 du mot 1");

String s = h.get("mot 1").get(1); // = "définition 2 du mot 1"

Sinon, pour aller au plus pressé et supprimer directement le warnig,
peut-être que tu peux essayer
((Vector<Object>)map.get("toto")).addElement(monObjet);
Mais c'est dommage, les template sont très intéressants. Les déclarations
sont un peu plus verbeuses, mais après, le compilateur peut vérifier les
types et l'utilisation est plus simple (pas besoin de cast à rallonge...)
String s = h.get("mot 1").get(1);
au lieu de
String s =(String)((Vector) h.get("mot 1")).get(1); // java 1.4

PS : Tout ça est à vérifier, vu que je n'utilise pas (encore) java 5.
(Vivement que Eclipse le supporte). Le code ci-dessus n'a pas été compilé...

"Manu" a écrit dans le message de
news:41ef7a6b$0$8009$
j'utilise ca :
((Vector)map.get("toto")).addElement(monObjet);


mais le probleme est que j'obtiens un warning :
warning: [unchecked] unchecked call to addElement(E) as a member of the
raw type java.util.Vector
((Vector)map.get("toto")).addElement("test");
^

et je ne sais pas comment annuler ce warning (meme si cela n'est pas
genant en soit)

manu


Avatar
Jocelyn
Salut,
J'ai juste 2 remarques a faire concernant le sujet discuté:
1. Il est possible d'obtenir des versions synchronisees des
collections non-depreciees via les methodes
Collections.synchronizedXXX(). Mieux vaut utiliser ca que les classes
Vector et Hashtable a mon sens.
2. Effectivement Herve a raison, tu peux avoir interet a coder toi meme
la synchro afin d'obtenir une granularite + fine que de prendre un truc
synchronise.
3. (he oui finalement j'en ai 3)Dans Java 5, il existe un nouvel
ensemble de classes pour aider dans la gestion du multithread, si tu
utilises cette version je te conseille de jeter un oeil sur:
http://java.sun.com/j2se/1.5.0/docs/guide/concurrency/overview.html

Cette fois c'est fini !
++
Manu wrote:


bonjour xavier,
mon probleme est que tout doit "synchronized", multi thread.
donc je ne peux utiliser Hashmap. que faire alors ?
pour ce qui est de vector, obsolete certe mais syncro ! alors que
ArrayList ne l'est pas ! quel est alors le remplacant de vector en syncrho
?




Il vaut mieux synchroniser toi même, en te donnant un objet verrou. De
toutes façons les synchronisations sur les Vectors ou HashMaps ne sont pas
forcément appropriées.