【问题标题】:how can i get two consecutive values from Iterator如何从迭代器中获取两个连续值
【发布时间】:2011-03-26 20:40:55
【问题描述】:

这是我尝试获取迭代器的两个连续元素的代码。

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

【问题讨论】:

    标签: java collections iterator


    【解决方案1】:

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

    另外,你确定你的第一行不应该是Iterator&lt;Value&gt; tr = values.iterator();吗?

    【讨论】:

    • 是的,你是对的,但是我的方法是这样的 public void Test(Iterator values){ Iterator tr = values;而 (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 值。
    • @tsegay:不要将迭代器传递给函数。而是传递对象。
    【解决方案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);
    }
    

    按预期打印以下内容

    第一:一个,第二:两个 第一:三,第二:四 第一:五,第二:五

    【讨论】:

    • 感谢您的回答和示例,但问题可能出在哪里。你能再检查一下我的代码吗,我已经更新了。
    • 这不会改变事情。我已经提到了您的问题的两个可能原因。
    【解决方案3】:

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

    可能的原因包括:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多