理解Java迭代器
如果我运行下面的代码,它将打印出3次重复,但是当我删除while循环中的If语句时(只是为了看看它将迭代多少次),它将启动一个无限循环 这个理解Java迭代器,java,loops,iteration,Java,Loops,Iteration,如果我运行下面的代码,它将打印出3次重复,但是当我删除while循环中的If语句时(只是为了看看它将迭代多少次),它将启动一个无限循环 这个hasNext()方法实际上是如何工作的?我认为这只会重复5次,因为我在列表中有5项 public class ExerciseOne { public static void main(String []args){ String []colors = {"MAGENTA","RED","WHITE","BLUE","CYA
hasNext()
方法实际上是如何工作的?我认为这只会重复5次,因为我在列表中有5项
public class ExerciseOne {
public static void main(String []args){
String []colors = {"MAGENTA","RED","WHITE","BLUE","CYAN"};
List<String> list = new ArrayList<String>();
for(String color : colors)
list.add(color);
String[] removeColors = {"RED","WHITE","BLUE"};
List<String> removeList = new ArrayList<String>();
for(String color : removeColors)
removeList.add(color);
removeColors(list,removeList);
System.out.printf("%n%nArrayList after calling removeColors:%n");
for(String color : list)
{
System.out.printf("%s ",color);
}
}
private static void removeColors(Collection<String> collection1, Collection<String> collection2)
{
Iterator<String> iterator = collection1.iterator();
while(iterator.hasNext()){
if(collection2.contains(iterator.next()))
System.out.println("duplicate");
}
}
}
公共课练习一{
公共静态void main(字符串[]args){
字符串[]颜色={“洋红”、“红色”、“白色”、“蓝色”、“青色”};
列表=新的ArrayList();
用于(字符串颜色:颜色)
列表。添加(颜色);
字符串[]RemoveColor={“红色”、“白色”、“蓝色”};
List removeList=new ArrayList();
用于(字符串颜色:RemoveColor)
移除列表。添加(颜色);
RemoveColor(列表,removeList);
System.out.printf(“%n%n调用RemoveColor后的数组列表:%n”);
用于(字符串颜色:列表)
{
System.out.printf(“%s”,颜色);
}
}
专用静态void removeColors(集合集合1、集合集合2)
{
迭代器迭代器=collection1.Iterator();
while(iterator.hasNext()){
if(collection2.contains(iterator.next()))
系统输出打印项次(“副本”);
}
}
}
事实上,这很简单
while(iterator.hasNext()){
if(collection2.contains(iterator.next()))
System.out.println("duplicate");
}
假设迭代器是指向列表元素的指针
当您调用next()
时,您将此指针向前移动一步
如果不移动指针,hasNext()
将始终为true,因为您仍在列表的开头
public class ExerciseOne {
public static void main(String []args){
String []colors = {"MAGENTA","RED","WHITE","BLUE","CYAN"};
List<String> list = new ArrayList<String>();
for(String color : colors)
list.add(color);
String[] removeColors = {"RED","WHITE","BLUE"};
List<String> removeList = new ArrayList<String>();
for(String color : removeColors)
removeList.add(color);
removeColors(list,removeList);
System.out.printf("%n%nArrayList after calling removeColors:%n");
for(String color : list)
{
System.out.printf("%s ",color);
}
}
private static void removeColors(Collection<String> collection1, Collection<String> collection2)
{
Iterator<String> iterator = collection1.iterator();
while(iterator.hasNext()){
if(collection2.contains(iterator.next()))
System.out.println("duplicate");
}
}
}
因此,您必须调用迭代器的
next()
,直到列表中没有剩余的元素。实际上,这非常简单
public class ExerciseOne {
public static void main(String []args){
String []colors = {"MAGENTA","RED","WHITE","BLUE","CYAN"};
List<String> list = new ArrayList<String>();
for(String color : colors)
list.add(color);
String[] removeColors = {"RED","WHITE","BLUE"};
List<String> removeList = new ArrayList<String>();
for(String color : removeColors)
removeList.add(color);
removeColors(list,removeList);
System.out.printf("%n%nArrayList after calling removeColors:%n");
for(String color : list)
{
System.out.printf("%s ",color);
}
}
private static void removeColors(Collection<String> collection1, Collection<String> collection2)
{
Iterator<String> iterator = collection1.iterator();
while(iterator.hasNext()){
if(collection2.contains(iterator.next()))
System.out.println("duplicate");
}
}
}
while(iterator.hasNext()){
if(collection2.contains(iterator.next()))
System.out.println("duplicate");
}
假设迭代器是指向列表元素的指针
当您调用next()
时,您将此指针向前移动一步
如果不移动指针,hasNext()
将始终为true,因为您仍在列表的开头
public class ExerciseOne {
public static void main(String []args){
String []colors = {"MAGENTA","RED","WHITE","BLUE","CYAN"};
List<String> list = new ArrayList<String>();
for(String color : colors)
list.add(color);
String[] removeColors = {"RED","WHITE","BLUE"};
List<String> removeList = new ArrayList<String>();
for(String color : removeColors)
removeList.add(color);
removeColors(list,removeList);
System.out.printf("%n%nArrayList after calling removeColors:%n");
for(String color : list)
{
System.out.printf("%s ",color);
}
}
private static void removeColors(Collection<String> collection1, Collection<String> collection2)
{
Iterator<String> iterator = collection1.iterator();
while(iterator.hasNext()){
if(collection2.contains(iterator.next()))
System.out.println("duplicate");
}
}
}
因此,您必须调用迭代器的
next()
,直到列表中没有任何剩余元素。如果删除If语句,那么它将进入无限循环,因为您的迭代器。next()
处于If状态。实际上,iterator.next()
是移动指针的api,而不是hasNext()
hasNext()
只需检查集合中是否有任何元素。由于删除if语句也会删除hasNext
api,因此指向集合的指针不会移动,hasNext
始终返回true
public class ExerciseOne {
public static void main(String []args){
String []colors = {"MAGENTA","RED","WHITE","BLUE","CYAN"};
List<String> list = new ArrayList<String>();
for(String color : colors)
list.add(color);
String[] removeColors = {"RED","WHITE","BLUE"};
List<String> removeList = new ArrayList<String>();
for(String color : removeColors)
removeList.add(color);
removeColors(list,removeList);
System.out.printf("%n%nArrayList after calling removeColors:%n");
for(String color : list)
{
System.out.printf("%s ",color);
}
}
private static void removeColors(Collection<String> collection1, Collection<String> collection2)
{
Iterator<String> iterator = collection1.iterator();
while(iterator.hasNext()){
if(collection2.contains(iterator.next()))
System.out.println("duplicate");
}
}
}
如果从If条件中取出迭代器.next()
,并将其移动到If条件之上,则即使删除If语句,循环仍将迭代5次
Iterator<String> iterator = collection1.iterator();
while(iterator.hasNext()){
String currentColor = iterator.next();
if(collection2.contains(currentColor)){
System.out.println("duplicate");
}
}
Iterator Iterator=collection1.Iterator();
while(iterator.hasNext()){
字符串currentColor=iterator.next();
if(collection2.contains(currentColor)){
系统输出打印项次(“副本”);
}
}
如果删除If语句,那么它将进入无限循环,因为迭代器.next()
处于If条件。实际上,iterator.next()
是移动指针的api,而不是hasNext()
hasNext()
只需检查集合中是否有任何元素。由于删除if语句也会删除hasNext
api,因此指向集合的指针不会移动,hasNext
始终返回true
如果从If条件中取出迭代器.next()
,并将其移动到If条件之上,则即使删除If语句,循环仍将迭代5次
Iterator<String> iterator = collection1.iterator();
while(iterator.hasNext()){
String currentColor = iterator.next();
if(collection2.contains(currentColor)){
System.out.println("duplicate");
}
}
Iterator Iterator=collection1.Iterator();
while(iterator.hasNext()){
字符串currentColor=iterator.next();
if(collection2.contains(currentColor)){
系统输出打印项次(“副本”);
}
}
为什么迭代器很重要/引入迭代器的问题很简单:
考虑下面的例子:
列表=新的ArrayList();
列表。添加(“Anurag”);
列表。添加(“Soni”);
列表。添加(“MMM”);
列表。添加(“GKP”);
用于(字符串s:列表){
如果(s.equals(“Anurag”)
s、 删除();
系统输出打印项次;
}
当您试图在迭代完成之前更改数据结构列表的结构时,这将抛出一个异常——“并发修改异常”。
因此,您可以出于同样的目的使用迭代器。
迭代器迭代器=List.Iterator();
while(iterator.hasNext()){
字符串current=iterator.next();
如果(当前==“Anurag”){
iterator.remove();
}否则{
系统输出打印项次(当前);
}
}
输出:Soni
嗯
吉凯恩
为什么迭代器很重要/引入迭代器的问题很简单:
考虑下面的例子:
列表=新的ArrayList();
列表。添加(“Anurag”);
列表。添加(“Soni”);
列表。添加(“MMM”);
列表。添加(“GKP”);
用于(字符串s:列表){
如果(s.equals(“Anurag”)
s、 删除();
系统输出打印项次;
}
当您试图在迭代完成之前更改数据结构列表的结构时,这将抛出一个异常——“并发修改异常”。
因此,您可以出于同样的目的使用迭代器。
迭代器迭代器=List.Iterator();
while(iterator.hasNext()){
字符串current=iterator.next();
如果(当前==“Anurag”){
iterator.remove();
}否则{
系统输出打印项次(当前);
}
}
输出:Soni
嗯
吉凯恩
您读过文档了吗?hasNext
不移动迭代器光标,iterator.next()
移动它,所以当您删除条件时,您实际删除的光标会更改为yes,当然,“如果迭代包含更多元素,则返回true”,但我无法理解当它到达列表的末尾时,为什么它会继续循环,我将尝试查找其他教程或文档,因为oracles’中的一个对于@leo its correc的mecheck答案不太清楚