迭代的.hasNext;的用法和.next; Java中的方法

如何解决迭代的.hasNext;的用法和.next; Java中的方法

对于两天的迭代接口,尤其是在while循环中,我感到很困惑,有 .hasNext(); next(); 方法。让我举个例子:

import java.util.*;  // imported whole java.util package.

class Main {
  public static void main(String[] args) {
    ArrayList<String> cars = new ArrayList<String>();  // created ArrayList which name is cars.
    cars.add("Volvo");
    cars.add("Mercedes"); 
    cars.add("BMW");


    Iterator<String> x = cars.iterator();

    while(x.hasNext()) {
      System.out.print(x.next() + " ");  // It prints Volvo Mercedes BMW
    }
  }
}

我知道 .hasNext(); 是布尔值,如果迭代包含元素,则返回true。 .next(); 方法返回下一个元素。在第一个元素Volvo之后,它返回 while(x.hasNext())并再次进入循环内部,但是此循环的计数器在哪里?我的意思是在打印沃尔沃之后,如何转到下一个元素?它返回所有元素,如果没有更多 .hasNext(); ,则返回false,代码继续到下一行是简单的答案和正确的答案,但我想清楚地理解它。

解决方法

实际上iterator()方法为Arraylist中的所有元素创建一个迭代器。现在在您的代码中,while循环x.hasNext()的条件检查列表是否包含元素,如果是,它将返回true,否则返回false。

现在x.next()指向ArrayList中的第一个元素(例如,类似于LinkedLists),并存储该对象(在您的情况下为Volvo)。调用此方法时,它基本上为您提供List中该对象的引用,并且 Iterator移至List中的下一个元素。调用next()方法时,迭代器(在您的情况下为x)将返回对象,然后移至下一个Element(在您的情况下为Mercedes)。

现在,当您调用next()方法时,您将再次发现Mercedes返回。要知道其工作方式,请键入三次System.out.println(x.next())而不是while循环,您将了解它已移至下一个位置。如果您第四次键入System.out.println(x.next()),它将给出异常,因为列表中没有元素。 线程“主”中的异常java.util.NoSuchElementException 这是异常。

这就是为什么使用hasNext()方法来检查元素是否存在的原因。 您可以将此与打印链表(如果您知道,则为数据结构)进行比较,在此我们将一个对象指向头节点进行打印并移至下一个节点。同样的情况是,它返回当前元素(对象)并移动到下一个元素(对象)。

,

while是Java语言,用于:继续这样做,直到事情改变为止。

这有点像这个普通的家庭任务:

如何洗碗

  • 检查柜台右侧是否还有脏盘子。
  • 如果有的话,可以洗碗:拿起最近的脏盘子,洗净,然后将其存放在柜台的左侧,然后回到该算法的开头。
  • 否则(没有脏盘子),就完成了。
while (counterRightSide.hasItems()) {
    Dish dirty = counterRightSide.fetch();
    Dish clean = sink.clean(dirty);
    counterLeftSide.stow(clean);
}

编辑:我现在意识到,“厨房柜台”是一个不幸的例子,给定同义词“厨房柜台”和“代码柜台”。我将使用“累加器”而不是“代码中的计数器”来解决此问题。

请注意,这里也没有蓄积器,而且洗碗时也不需要数脑子。您可以先清点您所拥有的脏盘子的数量(例如15个盘子),然后编写一个协议,在您决定完成这项工作之前,要准确抓15次脏盘子,但是您肯定会意识到那是一种方法是,另一种方法是...每次洗完1个脏盘子后,检查是否还剩下脏盘子。上面的代码是这样工作的。

请注意,从厨房柜台右侧“提取”商品的操作会更改该厨房柜台的属性。现在它少了一件物品。

迭代器也是如此:在迭代器上调用.next()会以某种形式对其进行更改。毕竟,如果您下次拨打两次,则这些呼叫的结果将有所不同。与连续someArrayList.get(5)多次调用形成对比;这根本不会改变arraylist,因此每次您都会得到相同的结果。 next()不是那样。

那如何运作?谁来计数这些东西?

好吧,这就是抽象的精妙之处! “集合”是可以做一些事情的东西,例如“它必须能够报告持有多少物品”,以及“它必须能够为您装饰一个可用于循环浏览的对象”它拥有的每个项目”。

这就是迭代器:可以执行此操作的对象。

那么它如何工作? 谁知道!没关系!只要您可以做这些事情,您就可以成为一个集合,您可以自由执行自己喜欢的任务。

好吧,但是像ArrayList这样的普通集合是如何做到的呢?

当然有柜台。这是实现:

    public Iterator<T> iterator() {
        return new Iterator<T>() {
            int counter = 0; // here it is!
 
            public boolean hasNext() {
                return counter < size();
            }

            public int next() {
                return get(counter++);
            }
        };
    }

您正在获取该对象并在您的代码(您的x变量)中对其进行引用,并且该对象具有一个带有计数器的字段。你看不到它;它是私有的,实际上不是Iterator类型的(Iterator是一个接口;您得到的是它的一些未知子类型,其中包含counter变量)。假设您通过在arraylist上调用.iterator()来获得迭代器。如果您在其他地方调用它,则可能有也可能没有计数器-只要迭代器工作,它的工作方式就无关紧要,这就是界面的美。

,

while循环检查条件,当条件为true时,执行循环主体并对其进行迭代,

while(condition){
//do something.
}

hasNext()是Iterator接口的一种方法,如果“迭代”中有更多元素,则返回true;如果没有更多元素,则它返回fals,并且不再进入while循环的主体:

while(x.hasNext){
//do something.
}

next()方法是Iterator接口中的方法,它返回迭代的下一个元素。

while(x.hasNext){
x.next();
}
,

我的意思是说在打印沃尔沃之后,如何转到下一个元素?它 返回所有元素,如果没有更多的.hasNext();返回假 和代码继续到下一行是简单的答案和正确的,但我 想清楚地理解它。

int cursor;       // index of next element to return
//...

public boolean hasNext() {
    return cursor != size;
}

public E next() {
    checkForComodification();
    int i = cursor;
    if (i >= size)
        throw new NoSuchElementException();
    Object[] elementData = ArrayList.this.elementData;
    if (i >= elementData.length)
        throw new ConcurrentModificationException();
    cursor = i + 1;
    return (E) elementData[lastRet = i];
}
//...

以上给出了ArrayList#hasNextArrayList#next的实现方式。该代码简单明了,易于理解。您可以使用反编译器或here查看完整代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?