web-dev-qa-db-fra.com

Comment obtenir la clé et la valeur d'une TreeMap à un index particulier

J'ai un TreeMap avec un ensemble de paires «clé et valeur». Comment puis-je obtenir la clé et la valeur à un index particulier de la carte TreeMap?

EDIT: @ TO-ALL: Merci. Mais je sais comment l'implémenter en utilisant une ArrayList supplémentaire. Je pensais qu'il n'y avait aucun moyen d'y parvenir sans utiliser une liste de tableaux supplémentaire.

16
Dileep Perla

Si vous voulez vraiment utiliser TreeMap et obtenir par position, vous pouvez utiliser les éléments suivants:

key => treemap.keySet().toArray()[0]
value => treemap.get(key); 

OU (si vous voulez juste de la valeur) 

treemap.values().toArray()[0]; 

Mais je suggérerais que vous utilisiez iterator, comme dans la méthode ci-dessus, il faut créer un tableau à chaque fois que vous voulez le trouver (donc pas si efficace) et vous devez aussi faire attention à vous assurer que l'index ne soit pas hors de portée.

23
Chandra

Tout d’abord, je ne sais pas pourquoi les gens ici s’inquiètent si souvent de la validité d’une question. Il existe de nombreux cas où des personnes ont jugé bon de conserver une liste de tableaux dans un ordre trié. La gestion d'une liste de tableaux dans un ordre trié est extrêmement inefficace pour les grandes listes.

Les nœuds d'entrée de la distribution source Java (Oracle) standard ne conservent pas la taille de leurs arbres descendants. De ce fait, il est impossible d'identifier un élément dans la carte par index sans recherche séquentielle inefficace.

Je trouve cet inconvénient si grave que j’ai écrit ma propre carte AVL qui permet d’obtenir efficacement des éléments par index et de calculer indexOf (E). Rendre cela possible est aussi simple que de conserver la taille de chacune des branches gauche et droite d'une entrée. Il est possible que la bibliothèque Glazedlists ait une arborescence de recherche intégrée dans celle-ci. Vous voudrez peut-être examiner cela.

6
Booyah Johnson

Vous pouvez copier un jeu d’entrées dans une liste puis obtenir l’entrée désirée par index:

list=new ArrayList<Map.Entry<K,V>>(treeMap.entrySet());
Map.Entry<K,V>=list.get(index);

Mais a) la copie prend O(N) heure et b) lorsque l'arbre change, la liste devient invalide.

4
Alexei Kaigorodov

Ce n'est peut-être pas la meilleure solution, mais vous pourrez accéder à votre clé/valeur à un index particulier.

TreeMap<Object, Object> foo = new TreeMap<Object, Object>();
Object key = foo.keySet().toArray(new Object[foo.size()])[YOUR_INDEX];
Object value = foo.get(key);
2

Cela pourrait être utile 

TreeMap< String,Integer > ht=new TreeMap<>();

ht.put("12",1);
ht.put("22",2);
ht.put("32",3);
ht.put("42",4);
for(int i=0;i<ht.size();i++)
{
   System.out.println(new Vector(ht.keySet()).get(i));
   System.out.println(new Vector(ht.values()).get(i));
}
0
Vineet Agarwal