迭代的使用';s.hasNext();and.next();Java中的方法
有两天我对.hasNext()感到非常困惑和下一步()迭代接口方法,尤其是在while循环中。让我举一个例子:迭代的使用';s.hasNext();and.next();Java中的方法,java,arraylist,while-loop,iteration,Java,Arraylist,While Loop,Iteration,有两天我对.hasNext()感到非常困惑和下一步()迭代接口方法,尤其是在while循环中。让我举一个例子: import java.util.*; // imported whole java.util package. class Main { public static void main(String[] args) { ArrayList<String> cars = new ArrayList<String>(); // created A
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
}
}
}
import java.util.*;//导入了整个java.util包。
班长{
公共静态void main(字符串[]args){
ArrayList cars=new ArrayList();//创建了名为cars的ArrayList。
添加(“沃尔沃”);
加上(“梅赛德斯”);
加上(“宝马”);
迭代器x=cars.Iterator();
while(x.hasNext()){
System.out.print(x.next()+“”);//它打印沃尔沃-奔驰-宝马
}
}
}
我知道.hasNext()是布尔值,如果迭代包含元素,则返回true。.next()方法返回下一个元素。在第一个元素Volvo之后,它返回而(x.hasNext())并再次进入循环的内部,但是这个循环的计数器在哪里?我的意思是,在打印沃尔沃之后,它如何进入下一个元素?它返回所有元素,如果没有更多的,则返回.hasNext()返回false,代码继续下一行是简单的答案和正确的,但我想清楚地理解它。实际上,迭代器()方法为(比方说)Arraylist中的所有元素创建迭代器。现在在代码中,while循环x.hasNext()的条件检查列表是否包含元素,如果是,则返回true,否则返回false
现在,x.next()指向ArrayList中的第一个元素(例如LinkedList),并存储该对象(在您的示例中为Volvo)。当您调用此方法时,它基本上为您提供了列表中该对象的引用,迭代器移动到列表中的下一个元素。调用next()方法时,迭代器(本例中为x)返回对象,然后移动到下一个元素(本例中为Mercedes)
现在,当您再次调用next()方法时,您将发现Mercedes被返回。若要了解它的工作原理,请三次键入System.out.println(x.next()),而不是while loopu将了解它移动到下一个位置。如果您第四次键入System.out.println(x.next()),它将给出异常,因为您的列表中没有更多的元素。线程“main”java.util.NoSuchElementException中的异常这是异常
这就是为什么使用hasNext()方法检查元素是否存在。
您可以将其与linkedlist(数据结构,如果您知道的话)的打印进行比较,我们将一个对象点打印到头部节点,然后移动到下一个节点。这里的情况与此相同,它返回当前元素(对象)并移动到下一个元素(对象)。实际上,迭代器()方法为(比方说)Arraylist中的所有元素创建迭代器。现在在代码中,while循环x.hasNext()的条件检查列表是否包含元素,如果是,则返回true,否则返回false
现在,x.next()指向ArrayList中的第一个元素(例如LinkedList),并存储该对象(在您的示例中为Volvo)。当您调用此方法时,它基本上为您提供了列表中该对象的引用,迭代器移动到列表中的下一个元素。调用next()方法时,迭代器(本例中为x)返回对象,然后移动到下一个元素(本例中为Mercedes)
现在,当您再次调用next()方法时,您将发现Mercedes被返回。若要了解它的工作原理,请三次键入System.out.println(x.next()),而不是while loopu将了解它移动到下一个位置。如果您第四次键入System.out.println(x.next()),它将给出异常,因为您的列表中没有更多的元素。线程“main”java.util.NoSuchElementException中的异常这是异常
这就是为什么使用hasNext()方法检查元素是否存在。
您可以将其与linkedlist(数据结构,如果您知道的话)的打印进行比较,我们将一个对象点打印到头部节点,然后移动到下一个节点。这里的情况也是一样,它返回当前元素(对象)并移动到下一个元素(对象)。
而
是java ese for:继续这样做,直到事情发生变化
这有点像普通的家务活:
如何洗碗
- 检查柜台右侧是否还有脏盘子
- 如果有的话,做洗碗的事情:拿起最近的脏盘子,洗干净,然后把它放在柜台的左边,然后回到这个算法的开头
- 否则(没有脏盘子),你就完了
.next()
,会以某种形式更改迭代器。毕竟,如果您调用next两次,这些调用的结果是不同的。与调用相比,比如说,someArrayList.get(5)
连续多次调用;这根本不会改变arraylist,因此您会得到相同的结果
while (counterRightSide.hasItems()) {
Dish dirty = counterRightSide.fetch();
Dish clean = sink.clean(dirty);
counterLeftSide.stow(clean);
}
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++);
}
};
}
while(condition){
//do something.
}
while(x.hasNext){
//do something.
}
while(x.hasNext){
x.next();
}
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];
}
//...