2016-03-10 2 views
2

У меня есть карта с некоторыми значениями.Iterate ConcurrentSkipListMap в обратном порядке

public ConcurrentMap<Long, Double> data = new ConcurrentSkipListMap<>(); 

Как переделать это в обратном направлении? Java-итератор, похоже, не имеет функции next() или функции для изменения карты.

ответ

5

ConcurrentSkipListMap реализует ConcurrentNavigableMap, который имеет descdendingMap() метод, возвращающий вид этой карты заказанного в обратном направлении:

Iterator<Entry<Long, Double>> reversed = data.descendingMap().entrySet().iterator(); 

Однако CSLM обращенно итератора гораздо медленнее, чем прямой итератора (O (журнал N) против O (1) для каждого next()), и поэтому его следует использовать только в случае крайней необходимости. В противном случае подумайте о создании карты с использованием «реверсивного» пользовательского компаратора:

data = new ConcurrentSkipListMap<>((k1, k2) -> Long.compare(k2, k1)); 
+0

очень умное решение! Он имеет базовый компаратор для преобразования reverseOrder() – mlewandowski

+0

@mlewandowski, но, принимая тот факт, что узлы ввода и индекса являются односвязными, такая итерация будет намного медленнее, поскольку индекс, однако, должен пересекаться в прямом направлении –

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