2010-08-17 3 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

Вы можете разместить полный источник, необходимый для воспроизведения проблемы? –

+0

Является ли текстовая карта пустой? –

+2

У вас есть еще один ArrayList в вашем классе? «library.ArrayList» не кажется правильным. – Carnell

ответ

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) Мы используем различные реализации класса (я использую java.util.concurrent.ConcurrentHashMap, java.util.List, java.util.ArrayList из JDK 1.5)

B) Вы модифицируя содержимое ArrayList или ConcurrentHashMap 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 $ Значения не могут быть добавлены в java.util.List –

Смежные вопросы