关于循环删除集合元素的问题

关于循环删除集合元素的问题

http://img1.sycdn.imooc.com/climg//5923a9de0001b0c906440230.jpg老师说不能循环删除集合元素是因为集合长度动态变化,这个怎么理解,虽然每次循环集合长度变化,但是每次新的循环开始,set的值不是也更新了么?感觉就算集合长度动态变化也没什么影响啊?Map集合没有removeAll方法,没办法像Set集合这样先把要删除的元素放在一个集合里,再一起删除,如果Map集合要删除部分元素怎么删除?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

集合在读取时不允许删除,HashMap是这么设计的,应该是为了数据的一致性。老师的说法回头我们会让老师改成更严谨一些的说法。

可以使用如下的方法实现HashMap数据的部分删除

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
public class Demo {
public static void main(String[] args) {
        HashMap<String,String> hm=new HashMap<String,String>();
hm.put("001", "cat");
hm.put("002", "dog");
hm.put("003", "monkey");
hm.put("004", "horse");
hm.put("005", "panda");
//输出删除数据前的所有key值
System.out.println("删除前的key值:");
Set<String> keySet=hm.keySet();
for(String key:keySet){
System.out.print(key+"    ");
}
System.out.println();
Iterator<Map.Entry<String, String>> it =hm.entrySet().iterator();  
       while(it.hasNext()){  
           Entry<String, String> entry=it.next();  
           String key=entry.getKey();  
           if(key.equals("002")||key.equals("005"))
                it.remove();
       }  
     //输出删除数据后的所有key值
       System.out.println("删除后的key值:");
       keySet=hm.keySet();
for(String key:keySet){
System.out.print(key+"    ");
}
}
}

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 莨菽菽 提问者 #1
    谢谢举例,不过还有点疑问:1. it.remove();也是放在循环内的,就是说在迭代器里面循环删除就不会像集合直接循环删除那样出错,这是为啥呢?2. 还有在Map里面,是不是删除Key,对应的Value(不管是1对1还是1对多)也会删除么(如果不是用什么办法删除value值)?因为例子里面只删除key值
    2017-05-23 13:01:36
  • 好帮手慕珊 回复 提问者 莨菽菽 #2
    1、具体删除方式到底有何不同,只能通过看底层源码了。2、调用remove方法不是只删除key,而是将key-value值一起删除。key-value是一体的,不会单独删除哪个。例子中只是对key值做的判断,把符合条件的在当前的迭代器中存储的元素进行删除。
    2017-05-23 13:20:21
  • 莨菽菽 提问者 #3
    非常感谢!
    2017-05-23 14:08:05
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师