对java ConcurrentHashMap中的值进行排序

时间:2010-08-17 23:47:45

标签: java sorting concurrenthashmap

我有以下用于对ConcurrentHashMap进行排序的代码:

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

抛出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)

我无法理解为什么。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

根据java api

  

<强> NoSuchElementException异常   由nextElement方法抛出   枚举表示存在   枚举中没有更多元素。

我在本地测试了以下代码

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

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

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

(使用Eclipse jdk 1.5)我得到了预期的输出。在将一些键值对放入ConcurrentHashMap之后我也运行了本地测试并且没有问题。根据我的成功,似乎以下一个(或两个)导致我们的结果之间存在差异。

A)我们正在使用不同的类实现(我使用jdk 1.5中的java.util.concurrent.ConcurrentHashMap,java.util.List,java.util.ArrayList)

B)您正在修改ArrayListConcurrentHashMap的内容。当迭代器迭代所述对象的内容时。运行排序时是否发生异常?我最好的猜测是另一个线程在你排序时弄乱你的ArrayList(因为ConcurentHashMap应该是线程安全的)。

答案 1 :(得分:-1)

没有必要创建一个新的ArrayList进行排序,因此,您可以这样做:

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

:OF