关于java iterator的next()方法的用法

关于java iterator的next()方法的用法,第1张

next()是java迭代器类(Iterator)的方法,获得当前游标指向的下一个元素,详细说明和应用如下:
1、迭代器(Iterator)介绍
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是javalangIterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
2、迭代器应用:
list l = new ArrayList();
ladd("aa");
ladd("bb");
ladd("cc");
for (Iterator iter = literator(); iterhasNext();) {
String str = (String)iternext();
Systemoutprintln(str);
}
/迭代器用于while循环
Iterator iter = literator();
while(iterhasNext()){
String str = (String) iternext();
Systemoutprintln(str);
}
/

迭代器模式:一种惰性获取数据项的方式,即按需一次获取一个数据项。

所有序列都是可以迭代的。我们接下来要实现一个 Sentence(句子)类,我们向这个类的构造方法传入包含一些文本的字符串,然后可以逐个单词迭代。

接下来测试 Sentence 实例能否迭代

序列可以迭代的原因:

iter()

解释器需要迭代对象 x 时,会自动调用iter(x)。

内置的 iter 函数有以下作用:

由于序列都实现了 __getitem__ 方法,所以都可以迭代。

可迭代对象:使用内置函数 iter() 可以获取迭代器的对象。

与迭代器的关系:Python 从可迭代对象中获取迭代器。

下面用for循环迭代一个字符串,这里字符串 'abc' 是可迭代的对象,用 for 循环迭代时是有生成器,只是 Python 隐藏了。

如果没有 for 语句,使用 while 循环模拟,要写成下面这样:

Python 内部会处理 for 循环和其他迭代上下文(如列表推导,元组拆包等等)中的 StopIteration 异常。

标准的迭代器接口有两个方法:

__next__ :返回下一个可用的元素,如果没有元素了,抛出 StopIteration 异常。

__iter__ :返回 self,以便在需要使用可迭代对象的地方使用迭代器,如 for 循环中。

迭代器:实现了无参数的 __next__ 方法,返回序列中的下一个元素;如果没有元素了,那么抛出 StopIteration 异常。Python 中的迭代器还实现了 __iter__ 方法,因此迭代器也可以迭代。

接下来使用迭代器模式实现 Sentence 类:

注意, 不要 在 Sentence 类中实现 __next__ 方法,让 Sentence 实例既是可迭代对象,也是自身的迭代器。

为了“支持多种遍历”,必须能从同一个可迭代的实例中获取多个独立的迭代器,而且各个迭代器要能维护自身的内部状态,因此这一模式正确的实现方式是,每次调用 iter(my_iterable) 都新建一个独立的迭代器。

所以总结下来就是:

实现相同功能,但却符合 Python 习惯的方式是,用生成器函数代替 SentenceIteror 类。

只要 Python 函数的定义体中有 yield 关键字,该函数就是生成器函数。调用生成器函数,就会返回一个生成器对象。

生成器函数会创建一个生成器对象,包装生成器函数的定义体,把生成器传给 next() 函数时,生成器函数会向前,执行函数定义体中的下一个 yield 语句,返回产出的值,并在函数定义体的当前位置暂停,。最终,函数的定义体返回时,外层的生成器对象会抛出 StopIteration 异常,这一点与迭代器协议一致。

如今这一版 Sentence 类相较之前简短多了,但是还不够慵懒。 惰性 ,是如今人们认为最好的特质。惰性实现是指尽可能延后生成值,这样做能节省内存,或许还能避免做无用的处理。

目前实现的几版 Sentence 类都不具有惰性,因为 __init__ 方法急迫的构建好了文本中的单词列表,然后将其绑定到 selfwords 属性上。这样就得处理整个文本,列表使用的内存量可能与文本本身一样多(或许更多,取决于文本中有多少非单词字符)。

refinditer 函数是 refindall 函数的惰性版本,返回的是一个生成器,按需生成 reMatchObject 实例。我们可以使用这个函数来让 Sentence 类变得懒惰,即只在需要时才生成下一个单词。

标准库提供了很多生成器函数,有用于逐行迭代纯文本文件的对象,还有出色的 oswalk 函数等等。本节专注于通用的函数:参数为任意的可迭代对象,返回值是生成器,用于生成选中的、计算出的和重新排列的元素。

第一组是用于 过滤 的生成器函数:从输入的可迭代对象中产出元素的子集,而且不修改元素本身。这种函数大多数都接受一个断言参数(predicate),这个参数是个 布尔函数 ,有一个参数,会应用到输入中的每个元素上,用于判断元素是否包含在输出中。

以下为这些函数的演示:

第二组是用于映射的生成器函数:在输入的单个/多个可迭代对象中的各个元素上做计算,然后返回结果。

以下为这些函数的用法:

第三组是用于合并的生成器函数,这些函数都可以从输入的多个可迭代对象中产出元素。

以下为演示:

第四组是从一个元素中产出多个值,扩展输入的可迭代对象。

以下为演示:

第五组生成器函数用于产出输入的可迭代对象中的全部元素,不过会以某种方式重新排列。

下面的函数都接受一个可迭代的对象,然后返回单个结果,这种函数叫“归约函数”,“合拢函数”或“累加函数”,其实,这些内置函数都可以用 functoolsreduce 函数实现,但内置更加方便,而且还有一些优点。

参考教程:
《流畅的python》 P330 - 363

一种自动迭代的更优雅的实现是使用 for循环

在Python中,迭代器(Iterator)和可迭代(iterable)的区别是,迭代器支持 iter ()和 next ()方法;可迭代支持 iter ()方法。可迭代只能在for循环中获得元素,迭代器还可以用next()方法获取元素。
list/truple/map/dict都是可迭代,但不是迭代器;这些数据的大小是确定的;迭代器不是,迭代器不知道要执行多少次,所以可以理解为不知道有多少个元素,每调用一次next(),就会往下走一步。

凡是可以for循环的,都是Iterable
凡是可以next()的,都是Iterator

首先for循环语句是程序中性能最高的循环之一,我一般都用它。
for 有两种形式:一种是数字形式,另一种是通用形式。
数字形式的 for 循环,通过一个数学运算不断地运行内部的代码块。 下面是它的语法:
block 将把 name 作循环变量。 从第一个 exp 开始起,直到第二个 exp 的值为止, 其步长为第三个 exp 。 更确切的说,一个 for 循环看起来是这个样子
注意下面这几点:
所有三个控制表达式都只被运算一次, 表达式的计算在循环开始之前。 这些表达式的结果必须是数字。
var,limit,以及 step 都是一些不可见的变量。 这里给它们起的名字都仅仅用于解释方便。
如果第三个表达式(步长)没有给出,会把步长设为 1 。
你可以用 break 和 goto 来退出 for 循环。
循环变量 v 是一个循环内部的局部变量; 如果你需要在循环结束后使用这个值, 在退出循环前把它赋给另一个变量。
通用形式的 for 通过一个叫作 迭代器 的函数工作。 每次迭代,迭代器函数都会被调用以产生一个新的值, 当这个值为 nil 时,循环停止。 通用形式的 for 循环的语法如下:
注意以下几点:
explist 只会被计算一次。 它返回三个值, 一个 迭代器 函数, 一个 状态, 一个 迭代器的初始值。
f, s,与 var 都是不可见的变量。 这里给它们起的名字都只是为了解说方便。
你可以使用 break 来跳出 for 循环。
环变量 var_i 对于循环来说是一个局部变量; 你不可以在 for 循环结束后继续使用。 如果你需要保留这些值,那么就在循环跳出或结束前赋值到别的变量里去。
到第二个 exp 的值为止, 其步长为第三个 exp 。 更确切的说,一个 for 循环看起来是这个样子
注意下面这几点:
1所有三个控制表达式都只被运算一次, 表达式的计算在循环开始之前。 这些表达式的结果必须是数字。
2var,limit,以及 step 都是一些不可见的变量。 这里给它们起的名字都仅仅用于解释方便。
如果第三个表达式(步长)没有给出,会把步长设为 1 。var,limit,以及 step 都是一些不可见的变量。 这里给它们起的名字都仅仅用于解释方便。
如果第三个表达式(步长)没有给出,会把步长设为 1 。
你可以用 break 和 goto 来退出 for 循环。
循环变量 v 是一个循环内部的局部变量; 如果你需要在循环结束后使用这个值, 在退出循环前把它赋给另一个变量。
通用形式的 for 通过一个叫作 迭代器 的函数工作。 每次迭代,迭代器函数都会被调用以产生一个新的值, 当这个值为 nil 时,循环停止。 通用形式的 for 循环的语法如下:
注意以下几点:
explist 只会被计算一次。 它返回三个值, 一个 迭代器 函数, 一个 状态, 一个 迭代器的初始值。
f, s,与 var 都是不可见的变量。 这里给它们起的名字都只是为了解说方便。
你可以使用 break 来跳出 for 循环。
环变量 var_i 对于循环来说是一个局部变量; 你不可以在 for 循环结束后继续使用。 如果你需要保留这些值,那么就在循环跳出或结束前赋值到别的变量里去。
到第二个 exp 的值为止, 其步长为第三个 exp 。 更确切的说,一个 for 循环看起来是这个样子

lua 里面的for循环有两种:

第一种是针对数字的循环,这个和其它编程语言里面的for循环是一样的

for i = 1,100 do
  print "do something"
end

第二种是遍历table的,循环使用迭代器,对于table的迭代有两种方式

1,作为数组,使用ipairs生成迭代器,索引从1到任意数字,如果数组中有某一个位置上的记录不存在,那么迭代就会停止

for index,value in ipairs({ 1,2,"hello",'c','o','0' }) do
    print(index,value)
end

2,作为哈希表,使用pairs生成迭代器,索引一个table的所有记录

for key,value in pairs({ 1,2,3,name = "demo",date = "2016-04-30","time" = "10:13:07" }) do
    print(key,value)
end

以上就是for循环的大概内容了,lua具体使用还得依赖自定义的C库。

先说迭代器,对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数,iter()是python的内置函数。iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()也是python的内置函数。在没有后续元素时,next()会抛出一个StopIteration异常,通知for语句循环结束。生成器(Generator)是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数据的时候使用yield语句。每次next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)。

除了用for循环也可以用迭代器

ArrayList<String> al=new ArrayList<String>();
for(int i=0;i<10;i++){
aladd(StringvalueOf(i));
}
Iterator<String> it=aliterator();
while(ithasNext()){
Systemoutprintln(itnext());
}

alt + / 如果不行 点击myeclipse ---preferences-----General -----keys ---找到content Assist 你想设成什么就是什么了哈 但是有一点不能和key里的其他重复


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13366393.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-22
下一篇 2023-07-22

发表评论

登录后才能评论

评论列表(0条)

保存