Итератор списка для добавления отсутствующего значения обратно в список - PullRequest
0 голосов
/ 05 мая 2018

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

public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<Integer> arrayList = new ArrayList<Integer>();
        arrayList.add(20);
        arrayList.add(40);
        arrayList.add(50);
        arrayList.add(70);
        arrayList.add(90);

        ListIterator<Integer> iterator = arrayList.listIterator();
        int firstVal = 0;
        int secVal = 0;
        while (iterator.hasNext()) {
            if (iterator.hasPrevious()) {
                firstVal = iterator.previous();
                iterator.next();
            }

            secVal = iterator.next();
            System.out.println("FirstValue " + firstVal);
            System.out.println("secVal " + secVal);
            if (firstVal != 0) {
                if ((secVal - firstVal) > 10) {
                    //iterator.previousIndex();
                    iterator.add(firstVal + 10);
                    firstVal = 0;
                    iterator.next();
                }
            }
        }
        System.out.println("iterator " + iterator.toString());

    }

Две вещи, которые я не могу заставить работать правильно.

Во-первых, когда я пытаюсь добавить значение разности обратно в список, оно не добавляется к правильному индексу. Например, первое значение равно 20, а второе - 40, новое значение 30 добавляется после 40 .

Во-вторых, здесь не создается пропущенное значение между 70 и 90, то есть 80.

Пожалуйста, поправьте меня в логике, которой я здесь не вижу.

спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Javadoc из previousIndex():

Возвращает индекс элемента, который будет возвращен последующим вызовом previous(). (Возвращает -1, если итератор списка находится в начале списка.)

Это никоим образом не меняет позицию итератора.

Используйте previous() для этого:

Возвращает предыдущий элемент в списке и перемещает позицию курсора назад . Этот метод может вызываться повторно для повторения списка в обратном направлении или смешиваться с вызовами next() для перехода вперед и назад. (Обратите внимание, что чередующиеся вызовы next и previous будут возвращать один и тот же элемент несколько раз.)

0 голосов
/ 05 мая 2018

Проблема в том, что когда вы обнаружите, что разница между двумя элементами больше 10, и когда вы вставляете, вместо вызова iterator.previous(); вы звоните iterator.previousIndex();

...