как я могу получить два последовательных значения от итератора - PullRequest
2 голосов
/ 08 августа 2010

Вот мой код, в котором я пытался получить два последовательных элемента 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.

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

Ответы [ 4 ]

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

Конечная проблема с оператором while. Ваш код не просто захватит первые два элемента из Итератора. Скорее, если в Итераторе есть четное количество элементов, он захватит последние два. Если число элементов нечетное, то вы получите одинаковое значение для 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, если в итераторе осталось только одно значение. Оба элемента массива будут null, если Итератор пуст.

2 голосов
/ 08 августа 2010

выглядит хорошо.Ваша проблема лежит где-то еще.Вероятно, 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
0 голосов
/ 08 августа 2010

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

Возможные причины включают:

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

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

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

Почему бы вам не использовать скобки вокруг 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();?

...