如何从Iterator获取两个连续值

时间:2010-08-08 02:44:50

标签: java collections iterator

这是我的代码,我试图获得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的相同值。

4 个答案:

答案 0 :(得分:3)

最终的问题是while语句。您的代码不只是从迭代器中获取前两个元素。相反,如果Iterator中有偶数个元素,它将获取最后两个元素。如果有一个奇数个元素,那么你将得到相同的x和y 值。具体来说,是最后一个元素。

更基本的是,您的代码问题是uvxy在您的方法之外声明。我假设你这样做是因为你不知道如何返回多个值。如果需要返回多个值,则返回元素数组,或返回自定义容器类。

以下是一个示例,说明如何在数组中返回从给定迭代器中取出的两个元素:

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

请注意,如果Iterator只剩下一个值,则返回数组的第二个元素将为null。如果Iterator为空,则数组的两个元素都为null

答案 1 :(得分:2)

看起来很好。你的问题出在其他地方。可能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

答案 2 :(得分:0)

为什么不在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,或者没有下一个值(奇数个元素),则此代码仅为yindex1提供相同的值。

另外请注意,您确定第一行不应该是Iterator<Value> tr = values.iterator();吗?

答案 3 :(得分:0)

您更新的代码不会改变任何内容。 @BalusC的诊断仍然是正确的。问题不在于代码的这一部分。

可能的原因包括:

  • 迭代器中有一个Value元素或奇数个Value元素
  • 您的Value元素与列表中的index1具有相同的值
  • 您已多次将相同的Value元素插入列表中。 (也许你忘了使用new Value(...)来创建每个元素?)
  • 您正在使用行为不正确的自定义Iterator类。

但是,如果没有看到相关代码,我们只能猜测真正的问题是什么。