Java 如何从迭代器中获得两个连续值

Java 如何从迭代器中获得两个连续值,java,collections,iterator,Java,Collections,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 = t

这是我的代码,我试图获得迭代器的两个连续元素

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);
    }
}
公共无效测试(迭代器值){
迭代器tr=值;
while(tr.hasNext()){
v=tr.next();
x=v.index1;
//u=零;
if(tr.hasNext()){
u=tr.next();
y=u.index1;
}否则{
u=v;
y=u.index1;
}
系统输出println(x);
系统输出打印项次(y);
}
}
但我仍然得到了x和Y的相同值


这有什么问题,我得到的两个变量x和y的值相同。

为什么不在
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);
    }
如果两个连续元素具有相同的
index1
,或者没有下一个值(奇数个元素),则此代码仅为
x
y
提供相同的值


另一方面,您确定第一行不应该是
Iterator tr=values.Iterator()

看起来不错。你的问题在别的地方。可能两者的
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);
}
List strings=Arrays.asList(“一”、“二”、“三”、“四”、“五”);
迭代器iter=strings.Iterator();
while(iter.hasNext()){
String first=iter.next();
字符串second=iter.hasNext()?iter.next():first;
System.out.printf(“第一个:%s,第二个:%s%n”,第一个,第二个);
}
按预期打印以下内容:

First: one, Second: two First: three, Second: four First: five, Second: five 第一:一,第二:二 第一:三,第二:四 第一:五,第二:五
您更新的代码不会改变任何东西@巴卢斯克的诊断仍然正确。问题不在代码的这一部分

可能的原因包括:

  • 迭代器中有一个
    Value
    元素或奇数个
    Value
    元素
  • 列表中的
    Value
    元素的
    index1
    值相同
  • 您已多次将相同的
    元素插入列表中。(可能您忘记使用
    新值(…)
    来创建每个元素?)
  • 您正在使用一个行为不正确的自定义
    迭代器

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

最终的问题是
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)
    };
}
公共静态值[]nextTwo(迭代器值){
返回新值[]{
(values.hasNext()?values.next():null),
(values.hasNext()?values.next():null)
};
}

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

是的,您是对的,但是我的方法类似于这个公共无效测试(迭代器值){Iterator 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的相同值。@tsegay:不要将迭代器传递给函数。而是传递对象。感谢您的回答和示例,但问题出在哪里。你能再检查一下我的代码吗,我已经更新了。这不会改变什么。我已经提到了造成你问题的两个可能原因。