2010-08-17 64 views
2

我有一個排序的ConcurrentHashMap的下面的代碼值:排序在Java的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) 

我不能明白爲什麼。有任何想法嗎?

+1

你可以張貼到重現問題需要一個完整的源代碼? – 2010-08-17 23:50:30

+0

文本貼圖是否爲空? – 2010-08-17 23:58:29

+2

你的類路徑上是否有另一個ArrayList? 「library.ArrayList」似乎不正確。 – Carnell 2010-08-18 00:43:06

回答

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)我們使用不同類的實現(I使用java.util.concurrent.ConcurrentHashMap中,java.util.List的,從java.util.ArrayList中JDK 1.5)

B)要修改的內容ArrayListConcurrentHashMap WHILE迭代器遍歷所述對象的內容。運行排序時發生異常嗎?我最好的猜測是另一個線程正在與你的ArrayList搞混(因爲ConcurentHashMap應該是線程安全的),而你正在排序。

-1

這是unnessary創建排序,從而一個新的ArrayList中,你可以這樣做:

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

使用Java7失敗,java.lang.ClassCastException:java.util.concurrent.ConcurrentHashMap $ Values不能轉換爲java.util.List – 2016-03-29 08:19:02