Как использовать OrderedMapIterator.previous()

Используя коллекции Apache Commons, я нашел OrderedMapIterator интерфейс для навигации вперед и назад в OrderedMap, Переход к следующей записи работает как ожидалось. Переход к предыдущему элементу возвращает не предыдущий элемент, а текущий элемент.

OrderedMap<String, String> linkedMap = new LinkedMap<>();
linkedMap.put("key 1", "value 1");
linkedMap.put("key 2", "value 2");
linkedMap.put("key 3", "value 3");

OrderedMapIterator<String, String> iterator = linkedMap.mapIterator();
while (iterator.hasNext()) {
    String key = iterator.next();
    System.out.println(key);

    if (key.endsWith("2") && iterator.hasPrevious()) {
        System.out.println("previous: " + iterator.previous());
        iterator.next(); // back to current element
    }
}

Я ожидал выход

key 1
key 2
previous: key 1
key 3

но получил

key 1
key 2
previous: key 2
key 3

Я использую OrderedMapIterator неправильно или это ошибка?

1 ответ

Решение

Это потому, что технически .previous() не точно устанавливает текущую запись на предыдущую, но next.before, Посмотрите, как работает итерационный процесс:

nextEntry() {
    ...
    last = next; //its current
    next = next.after;
    ...

previousEntry() {
    ...
    final LinkEntry<K, V> previous = next.before;
    ...
    next = previous;
    last = previous;

Таким образом, ваш поток повлияет на last(current)|next говорится следующее:

null|1 -> (next) -> 1|2 -> (next) -> 2|3 <- (previous?) <- 2|2 -> (next) -> 3|null

Причина, по которой я могу думать, почему так себя ведет, потому что она предназначена для вызова .next(), .previous() в отдельных циклах.

Представьте себе ситуацию, когда вы повторяете весь путь вперед, а затем вам нужно повторять весь путь назад.

while (it.hasNext()) {
    String key = it.next();
    list.add(key);
}
while (it.hasPrevious()) {
    String key = it.previous();
    list.remove(key);
}

С тем поведением, которое вы хотите иметь, вы в конечном итоге получили бы [ключ 3] в списке, что неверно, но в настоящее время работает нормально.

Другие вопросы по тегам