关于iterator的remove方法的问题

李灵晖 2013-01-09 04:20:34

package com.nbgnuskin.collection;

import java.util.*;

public class IteratorTest {

public IteratorTest() {
// TODO Auto-generated constructor stub
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Collection c = new HashSet();
c.add(new Name("a1","b1"));
c.add(new Name("a2222","b2"));
c.add(new Name("a3","b3"));
c.add(new Name("a4","b4"));
// while(i.hasNext())
// {
// Name n = (Name) i.next();
// if(n.getfirstName().length() > 3)
// {
// i.remove();
// }
// System.out.println(n.getfirstName() + " " + n.getfirstName().length());
// }
for(Iterator i = c.iterator();i.hasNext();)
{
Name n = (Name)i.next();
if (n.getfirstName().length() > 3) {
i.remove(); }
System.out.println(n.getfirstName() + " " + n.getfirstName().length());
}
}

}


上面写了一个小程序,主要是测试iterator的remove方法,为什么中间的那个remove方法没有作用?谢谢
...全文
376 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
nmyangym 2013-01-09
  • 打赏
  • 举报
回复
删除是从c里删除了。 楼主再次迭代输出一次,会看见那个含a2222的不见了。
李灵晖 2013-01-09
  • 打赏
  • 举报
回复
引用 5 楼 zssazrael 的回复:
LZ 的代码的逻辑是移除某些值,打印所有值,看打印的数据当然看不出来是否移除了。
谢谢上面的各位,我放打印的地方不对 最后的代码如下,就正常了


import java.util.*;

public class IteratorTest {
	
	public IteratorTest() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Collection c = new HashSet();
		c.add(new Name("a1","b1"));
		c.add(new Name("a2222","b2"));
		c.add(new Name("a3","b3"));
		c.add(new Name("a4","b4"));
//		while(i.hasNext())
//		{
//			Name n = (Name) i.next();
//			if(n.getfirstName().length() > 3)
//			{
//				i.remove();
//			}
//			System.out.println(n.getfirstName() + " " + n.getfirstName().length());
//		}
		for(Iterator i = c.iterator();i.hasNext();)
		{
			Name n = (Name)i.next();
			if (n.getfirstName().length() > 3) {
				i.remove();
			}
			
		}
		System.out.println(c);
	}

}
lizhengjun555 2013-01-09
  • 打赏
  • 举报
回复
已经起作用了!

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Collection c = new HashSet();
		c.add(new Name("a1", "b1"));
		c.add(new Name("a2222", "b2"));
		c.add(new Name("a3", "b3"));
		c.add(new Name("a4", "b4"));
		System.out.println("操作前集合中的元素个数:" + c.size());
		for (Iterator i = c.iterator(); i.hasNext();) {
			Name n = (Name) i.next();
			if (n.getFirstName().length() > 3) {
				i.remove();
			}
			System.out.println(n.getFirstName() + " "
					+ n.getFirstName().length());
		}
		System.out.println("操作后集合中的元素个数:" + c.size());
	}
打印的结果是:

4
a4 2
a1 2
a2222 5
a3 2
3
幽饮烛 2013-01-09
  • 打赏
  • 举报
回复
LZ 的代码的逻辑是移除某些值,打印所有值,看打印的数据当然看不出来是否移除了。
失落夏天 2013-01-09
  • 打赏
  • 举报
回复
结果: a1 a4 a3 a2222 Name [firstName=a1, s2=b1] Name [firstName=a4, s2=b4] Name [firstName=a3, s2=b3]
失落夏天 2013-01-09
  • 打赏
  • 举报
回复
另外楼主注意一下规范。 getFirstName();//自动生成的 getfirstName(); 最后给改成了增强for的形式,你看下吧。 只是参考而已。

public static void main(String[] args) {
		
		 Collection<Name> c = new HashSet<Name>();
	        c.add(new Name("a1","b1"));
	        c.add(new Name("a2222","b2"));
	        c.add(new Name("a3","b3"));
	        c.add(new Name("a4","b4"));
//	        while(i.hasNext())
//	        {
//	            Name n = (Name) i.next();
//	            if(n.getfirstName().length() > 3)
//	            {
//	                i.remove();
//	            }
//	            System.out.println(n.getfirstName() + " " + n.getfirstName().length());
//	        }
	      
	        /*for(Iterator i = c.iterator();i.hasNext();)
	        {
	        	//System.out.println(i.toString());
	            Name n = (Name)i.next();
	            System.out.println(n.getFirstName());
	            if (n.getFirstName().length() > 3) {
	            	
	                c.remove(i);            
	                
	            }
	            //System.out.println(n.getFirstName().toString() + " " + n.getFirstName().length());
	        }*/
	        for(Name o:c){
	        	System.out.println(o.getFirstName());
	        	if(o.getFirstName().length()>3){
	        		c.remove(o);
	        	}
	        }
	        
	        for(Object o:c){
	        	System.out.println(o.toString());
	        }
	}
李灵晖 2013-01-09
  • 打赏
  • 举报
回复
谢谢了,也是不行,在iterator里面一般都是用他的对象的remove方法,而且应该是锁定collection里面的元素,collection的remove应该是不行的,测试了一下上面的代码,还是不行,也不知道哪里出了问题。
失落夏天 2013-01-09
  • 打赏
  • 举报
回复

public static void main(String[] args) {
		
		 Collection c = new HashSet();
	        c.add(new Name("a1","b1"));
	        c.add(new Name("a2222","b2"));
	        c.add(new Name("a3","b3"));
	        c.add(new Name("a4","b4"));
//	        while(i.hasNext())
//	        {
//	            Name n = (Name) i.next();
//	            if(n.getfirstName().length() > 3)
//	            {
//	                i.remove();
//	            }
//	            System.out.println(n.getfirstName() + " " + n.getfirstName().length());
//	        }
	      
	        for(Iterator i = c.iterator();i.hasNext();)
	        {
	        	System.out.println(i.toString());
	            Name n = (Name)i.next();
	            if (n.getFirstName().length() > 3) {
	                c.remove(i);        //这一句,看区别    }
	            System.out.println(n.getFirstName() + " " + n.getFirstName().length());
	        }
	}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧