java iterator循环遍历集合(比如HashSet)的原理

java iterator循环遍历集合(比如HashSet)的原理,第1张

迭代器要是用泛型。

Iterator<Integer> it=map1keySet()iterator();

还有就是在使用迭代器的时候,你判断一次,游标走了2次,使用了2次next();

while(ithasNext()){

int key=itnext();

if(key==1)

//后边自己写了

}

答:     是的,需要重新调用iterator()方法,放回1个新的迭代器

原因: 1:  因为迭代器使用完了,里面也就没有元素了,

2: 并且java语言没有提供重置的方法

代码如下

import javautilArrayList;

import javautilIterator;

public class ListDemo {

public static void main(String[] args) {

ArrayList<Integer> list = new ArrayList<Integer>();

listadd(5);

listadd(3);

listadd(2);

Iterator<Integer> it = listiterator();

while (ithasNext()) {

Systemoutprintln(itnext());

}

Systemoutprintln(ithasNext());// false 表示没有元素了

//Systemoutprintln(itnext());//会抛出异常 NoSuchElementException

it = listiterator(); //从集合里重新获得迭代器

}

}

拓展思考:

对于此类问题,往往是对java类不太熟悉, 可以经常使用java api文档, 查看文档,你会快速了解到某个类的方法有哪些, 继承了哪些接口等情况,

比如Iterator类的方法说明如下

方法摘要

boolean    hasNext()

如果仍有元素可以迭代,则返回 true。  

E    next()

返回迭代的下一个元素。  

void    remove()

从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选 *** 作)。  

Iterator<String> it = setiterator() 这时得到一个迭代器,它的指针位于第一个元素之前。

然后我们不停地 hasNext() 再 next 得到值,当hasNext 为 false 时当然就不能去 next 了。

这背后的位置索引是在迭代器内部记录着的,我们不能直接改它的值,只能 next 去下一个。

不过像 ListIterator 则是双向的,可以 previous。递增递减都是由 next / previous 方法来 *** 作的。

一:

一般创建一个实例化对象,分两步,注意这句:"实例化对象",

1)创建一个对象 2)对该对象进行实例化(用new 关键字)

比如:

List list =null;(创建一个对象list)

list = new ArrayList(); (进行实例化)

当然一般我们会简写为:list list = new ArrayList();

二:

但不是所有的实例化对象都是这样创建的,还有一种:用其它类返回一个实例化的对象

比如:

Iterator it = null; 这里创建一个 it 对象来接收 返回的实例对象

it = listiterator(); listiterator()方法返回一个Iterator()实例对象

简写为:Iterator it = listiterator();

Iterator使用:

一个ostream_iteartor的例子:

复制代码

1 #include <iostream>

2

3 using namespace std;

4

5 template<class T>

6 class Ostream_iterator {

7 public:

8 Ostream_iterator(ostream &os,const char s):

9 strm(&os), str(s){}

10 Ostream_iterator& operator++() {return this;}

11 Ostream_iterator& operator++(int) {return this;}

12 Ostream_iterator& operator() {return this;}

13 Ostream_iterator& operator=(const T& t)

14 {

15 strm << t << str;

16 return this;

17 }

18

19 private:

20 ostream strm;

21 const char str;

22 };

23

24 template<class In,class Out>

25 Out Copy(In start,In beyond,Out dest)

26 {

27 while(start != beyond)

28 dest++ = start++;

29 return dest;

30 }

31

32 int main()

33 {

34 Ostream_iterator<int> oi(cout, " \n");

35

36 int a[10];

37 for (int i = 0;i!=10;++i)

38 a[i] = i+1;

39 Copy(a,a+10,oi);

40

41 return 0;

42 }

复制代码

在这个例子中,我们简单的构造了一个ostream_iterator,并且使用了copy来输出这个ostream_iterator和STL差别还是很大,不过功能上已经差不多了我想读者们应该也能看懂代码吧,所以就不用多做什么解释了

第二个例子中,我们讲构造一个istream_iterator

对于一个istream_iterator来说,我们必须要存的是T buffer和istream strm不过由于istream的特殊性,我们必须知道buffer是否满,以及是否到达尾部,因此,我们的结构是这样的

复制代码

1 template <class T>

2 class Istream_Iterator{

3

4 private:

5 istream strm;

6 T buffer;

7 int full;

8 int eof;

9 };

复制代码

对于构造函数来说,因为有eof的存在,因此,我们自然想到,我们的默认构造函数就应该把eof设为1而对于有istream的iterator,都应该为0

1 Istream_iterator(istream &is):

2 strm(&is),full(0),eof(0){}

3 Istream_iterator():strm(0),full(0),eof(1){}

对于我们的版本的istream_iterator来说,我们需要完成的功能有

进行取值 *** 作(dereference),既(p)

自增 *** 作

比较

自增 *** 作:

我们知道,在istream中,一旦获取到一个值了之后,我们将不在访问这个值我们的iterator也要符合这样的要求,因此,我们通过full来控制

复制代码

1 Istream_iterator& operator++(){

2 full = 0;

3 return this;

4 }

5 Istream_iterator operator++(int){

6 Istream_iterator r = this;

7 full = 0;

8 return r;

9 }

复制代码

Dereference:

对于解除引用 *** 作来说,我们需要将流中缓存的值存入buffer内同时,我们要判断读取是否到结尾,到了结尾则应当出错

在这里我们写了一个私有函数fill(),这个将在比较的时候用到

复制代码

T operator() {

fill();

assert(eof);//我们断定不应该出现eof

return buffer;

}

void fill(){

if (!full && !eof) {

if (strm >> buffer)

full = 1;

else

eof = 1;

}

}

复制代码

比较:

对于比较来说,只有两个istream_iterator都同一个对象或者都处于文件尾时,这两个istream_iterator才相等因此这里其比较对象为istream_iterator而不是const istream_iterator

复制代码

template<class T>

int operator==(Istream_iterator<T> &p,Istream_iterator<T>& q)

{

if (peof && qeof)

return 1;

if (!peof && !qeof)

return &p == &q;

pfill();qfill();

return peof == qeof;

}

复制代码

最后的测试例子,读者可以把之前的copy和ostream_iterator拷下来

复制代码

int main()

{

Ostream_iterator<int> o(cout,"\t");

Istream_iterator<int> i(cin);

Istream_iterator<int> eof;

Copy(i,eof,o);

return 0;

}

复制代码

结论:

iterator是STL实现所有算法已经其通用型的基础通过对iterator分类,使得算法的使用者在使用时不需要知道具体实现就可知道算法对于参数的要求,形成一个通用的体系

以上就是关于Iterator it =map1.keySet().iterator(); while(it.hasNext()){ if((Integer)it.next()==1) if的条件报错全部的内容,包括:Iterator it =map1.keySet().iterator(); while(it.hasNext()){ if((Integer)it.next()==1) if的条件报错、Java中如果集合迭代器已经迭代完了,如果还想迭代,只能在调用一遍iterator返回一个新的吗、java iterator循环遍历集合(比如HashSet)的原理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/langs/8860425.html

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

发表评论

登录后才能评论

评论列表(0条)

保存