Сортировка значений в java ConcurrentHashMap - PullRequest
2 голосов
/ 18 августа 2010

У меня есть следующий код для сортировки 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 ]

3 голосов
/ 18 августа 2010

Согласно 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, пока итератор итерирует содержимое указанного объекта. Возникает ли исключение при выполнении сортировки? Мое лучшее предположение, что другой поток связывается с вашим ArrayList (поскольку ConcurentHashMap должен быть безопасным для потоков) во время сортировки.

0 голосов
/ 18 августа 2010

Создать новый 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

...