Как я могу получить два последовательных значения от Итератора

78
11

Вот мой код, который я пытался получить двумя последовательными элементами Iterator.


public void Test(Iterator<Value> values) {
Iterator<Value> tr = values;
while (tr.hasNext()) {
v = tr.next();
x = v.index1;
// u = null;

if (tr.hasNext()) {
u = tr.next();
y = u.index1;
} else {
u = v;
y = u.index1;
}

System.out.println(x);
System.out.println(y);
}
}


Но все же я получаю одинаковые значения для x и Y.


Что не так с этим, я получаю то же значение для двух переменных x и y.

спросил(а) 2021-01-25T20:01:07+03:00 4 месяца, 3 недели назад
1
Решение
90

Конечная проблема заключается в инструкции while. Ваш код не просто захватит первые два элемента из Iterator. Скорее, если в Iterator есть четное число элементов, он схватит последние два. Если существует нечетное число элементов, то вы получите одинаковое значение для x и y. В частности, последний элемент.


Более принципиально проблема с вашим кодом u, v, x и y объявлена ​​вне вашего метода. Я предполагаю, что вы это делаете, потому что не знаете, как вернуть больше одного значения. Если вам нужно вернуть несколько значений, верните массив элементов или верните пользовательский класс контейнера.


Вот пример того, как вы можете вернуть в массиве два элемента, снятых с данного Итератора:

public static Value[] nextTwo(Iterator<Value> values) {
return new Value[] {
(values.hasNext()?values.next():null),
(values.hasNext()?values.next():null)
};
}

Обратите внимание, что второй элемент возвращаемого массива будет null, если у Iterator осталось только одно значение. Оба элемента массива будут null, если Итератор пуст.

ответил(а) 2021-01-25T20:01:07+03:00 4 месяца, 3 недели назад
77

Это выглядит хорошо. Ваша проблема лежит где-то в другом месте. Вероятно, index1 обоих одинаковы? Или у вас есть только один элемент в итераторе?


Следующий пример


List<String> strings = Arrays.asList("one", "two", "three", "four", "five");
Iterator<String> iter = strings.iterator();
while (iter.hasNext()) {
String first = iter.next();
String second = iter.hasNext() ? iter.next() : first;

System.out.printf("First: %s, Second: %s%n", first, second);
}

печатает, как ожидалось, следующие



First: one, Second: two
First: three, Second: four
First: five, Second: five

ответил(а) 2021-01-25T20:01:07+03:00 4 месяца, 3 недели назад
45

Почему бы вам не использовать фигурные скобки вокруг вашего else и избежать ненужных назначений переменных:


    while (tr.hasNext()) {
v = tr.next();
x = v.index1;
// u = null;
if (tr.hasNext()) {
u = tr.next();
y = u.index1;
} else {
y = v.index1;
}
System.out.println(x);
System.out.println(y);
}

Этот код будет давать только те же значения для x и y, если либо два последовательных элемента имеют одинаковый index1, либо нет следующего значения (нечетное число элементов).


С другой стороны, вы уверены, что ваша первая строка не должна быть Iterator<Value> tr = values.iterator();?

ответил(а) 2021-01-25T20:01:07+03:00 4 месяца, 3 недели назад
45

Ваш обновленный код ничего не меняет. Диагностика @BalusC по-прежнему правильная. Проблема не в этой части кода.


Возможные причины:


    У вас есть один элемент Value или нечетное число элементов Value в итераторе
    У вас есть Value элементы с тем же значением для своих index1 в списке
    Вы добавили один и тот же элемент Value в список несколько раз. (Может быть, вы забыли использовать new Value(...) для создания каждого элемента?)
    Вы используете собственный Iterator класс, который ведет себя некорректно.

Но, не видя соответствующего кода, мы можем только догадываться о том, какова может быть настоящая проблема.

ответил(а) 2021-01-25T20:01:07+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема