2010-08-08 73 views
2

这是我的代码,我试图获得两个连续的迭代器元素。我如何从迭代器获得两个连续值

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的值相同。

回答

3

最终的问题是while声明。你的代码不会从Iterator获取前两个元素。相反,如果迭代器中存在偶数个元素,它将抓住最后两个元素。如果存在奇数个元素,则您将得到x和y的相同值。具体来说,最后一个元素。

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

这里是如何在一个数组的形式返回给定的Iterator的带下两个元素的例子:

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

注意,返回数组的第二个元素是null如果迭代只有一个值留在它。如果迭代器为空,则数组的两个元素将为null

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); 
    } 

此代码只会给相同的值xy如果任何两个连续的元素具有相同index1,或者没有下一个值(奇数个元素)。

在另一张纸上,你确定你的第一行不应该是Iterator<Value> tr = values.iterator();

+0

是的,你是对的,但我的方法是这样的 公共无效测试(迭代器值){ 迭代器 TR =值; (tr.hasNext()){ v = tr.next(); x = v.index1; // u = null; if(tr.hasNext()){ u = tr.next(); y = u.index1;其他{ u = v; y = u.index1; } System.out.println(x); System.out.println(y); } } 但是我仍然得到x和Y的相同值。 – tkt986 2010-08-08 02:56:30

+0

@tsegay:不要将Iterator传递给函数。改为传递对象。 – Borealid 2010-08-08 03:19:00

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 
+0

感谢您的答案和示例,但问题在哪里。你能否再次检查我的代码,我已经更新了它。 – tkt986 2010-08-08 02:59:38

+1

这不会改变事情。我已经提到了你的问题的两个可能的原因。 – BalusC 2010-08-08 03:00:15

0

你更新后的代码不会改变任何东西。 @ BalusC的诊断仍然是正确的。问题不在代码的这一部分。

可能原因包括:

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

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