Java for循环删除ArrayList重复元素陷阱,Iterator迭代器遍历删除重复元素
  TEZNKK3IfmPf 2023年11月14日 22 0
Java for循环删除ArrayList重复元素陷阱,Iterator迭代器遍历删除重复元素

这是一个一不留神就犯下错误的Java列表ArrayList重复删除元素陷阱,并且问题比较隐蔽。问题描述,假设一个ArrayList存储若干个字符串String元素,这些元素中存在若干重复的、一模一样的元素,编程实现把这些重复元素全部删除。
常见的代码写法是for循环定点删除:
 ArrayList<String> mLists = new ArrayList<>();
	        mLists.add("zhang");
	        mLists.add("phil");
	        mLists.add("csdn");
	        mLists.add("csdn");
	        mLists.add("csdn");

	        for (int i = 0; i < mLists.size(); i++) {
	            String s = mLists.get(i);
	            if(s.equals("csdn"))
	            	mLists.remove(i);
	        }

	        for(int i=0;i<mLists.size();i++){
	            System.out.print(mLists.get(i)+" ");
	        }

运行输出:

 

zhang phil csdn 
这个例子中有5个字符串,其中“csdn”重复出现3次,代码本意是把这些重复3此的“csdn”字符串完全删除,结果还有参数,可见没有完全删除,原因是在于Java的ArrayList在删除元素时候,整个队列在动态变化,整个队列的index和长度均在变化中,所以在for循环中游标不准。

 

正确的删除方法是使用Java迭代器Iterator进行删除。
例如代码:
ArrayList<String> mLists = new ArrayList<>();
		mLists.add("zhang");
		mLists.add("phil");
		mLists.add("csdn");
		mLists.add("csdn");
		mLists.add("csdn");

		Iterator<String> iterator = mLists.iterator();
		while (iterator.hasNext()) {
			String s = iterator.next();
			if (s.equals("csdn")) {
				iterator.remove();
			}
		}

		for (int i = 0; i < mLists.size(); i++) {
			String s = mLists.get(i);
			System.out.print(s + " ");
		}

输出结果正确:
zhang phil 
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   23天前   50   0   0 java
  TEZNKK3IfmPf   2024年05月31日   55   0   0 java
TEZNKK3IfmPf