2010-08-17 10 views
2

je le code suivant pour trier une ConcurrentHashMap:Tri des valeurs dans un ConcurrentHashMap java

ConcurrentHashMap<String,String> text = new ConcurrentHashMap<String,String>(); 
.... 
List<String> list = new ArrayList<String>(text.values()); 
Collections.sort(list); 

qui jette un NoSuchElementException:

Caused by: java.util.NoSuchElementException 
     at library.ArrayList$Itr.next(ArrayList.java:1232) 
     at library.ArrayList$ListItr.next(ArrayList.java:1263) 
     at java.util.Collections.sort(Collections.java:120) 

Et je ne peux pas comprendre pourquoi. Des idées?

+1

Pouvez-vous poster une source complète nécessaire pour reproduire le problème? –

+0

La carte de texte est-elle vide? –

+2

Avez-vous une autre ArrayList sur votre classpath? "library.ArrayList" ne semble pas correct. – Carnell

Répondre

3

Selon le java api

NoSuchElementException levée par la méthode nextElement d'un Enumeration pour indiquer qu'il y a des éléments plus dans l'énumération.

J'ai testé le code suivant localement

ConcurrentHashMap<String, String> t = new ConcurrentHashMap<String, String>(); 

List<String> al = new ArrayList<String>(t.values()); 
Collections.sort(al); 

System.out.println("no bugs"); 

(avec Eclipse JDK 1.5) j'obtenir le résultat attendu. J'ai aussi effectué mon test local après avoir mis quelques paires valeur/clé dans le ConcurrentHashMap et n'ai eu aucun problème. Sur la base de mes succès, il semblerait que l'un (ou les deux) des éléments suivants cause l'écart entre nos résultats.

A) Nous utilisons différentes implémentations de classe (j'utilise java.util.concurrent.ConcurrentHashMap, java.util.List, java.util.ArrayList de JDK 1.5)

B) Vous modifiez le contenu de ArrayList ou ConcurrentHashMap PENDANT qu'un itérateur parcourt le contenu dudit objet. L'exception se produit-elle lors de l'exécution du tri? Ma meilleure estimation est un autre thread est de jouer avec votre ArrayList (puisque ConcurentHashMap est censé être thread safe) pendant que vous êtes en train de trier.

-1

Il est unnessary de créer une nouvelle ArrayList pour le tri, donc, vous pouvez faire comme ceci:

ConcurrentHashMap<String,String> text = new ConcurrentHashMap<String,String>(); 
List<String> textList=text.values(); //unmodifiable List here. 
Collections.sort(textList);// it also can sort. 

: EOF

+0

L'utilisation de Java7 échoue avec java.lang.ClassCastException: java.util.concurrent.ConcurrentHashMap $ Les valeurs ne peuvent pas être converties en java.util.List –