这是我的代码,我试图获得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的相同值。
答案 0 :(得分:3)
最终的问题是while
语句。您的代码不只是从迭代器中获取前两个元素。相反,如果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)
};
}
请注意,如果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
,或者没有下一个值(奇数个元素),则此代码仅为y
和index1
提供相同的值。
另外请注意,您确定第一行不应该是Iterator<Value> tr = values.iterator();
吗?
答案 3 :(得分:0)
您更新的代码不会改变任何内容。 @BalusC的诊断仍然是正确的。问题不在于代码的这一部分。
可能的原因包括:
Value
元素或奇数个Value
元素Value
元素与列表中的index1
具有相同的值Value
元素插入列表中。 (也许你忘了使用new Value(...)
来创建每个元素?)Iterator
类。但是,如果没有看到相关代码,我们只能猜测真正的问题是什么。