TreeMap根据key中的指定元素进行删除修改的两种方式实现及注意事项:

方式一:利用增强for进行删除和修改

总结:逻辑简单,但是局限性太强,如果排序规则是从小到大进行排序的,则该方法不能进行删除,删除将报错,但是可以修改使用

如果对排序规则是从小到大的进行删除,将会出现报错,我对报错进行了捕获,所以删除失败程序仍运行:

效果如下:

没有捕获的话对从小到大的集合进行删除则会报出以下异常:

如果此处排序规则为从大到小的规则则可以修改删除成功:

排序关键代码逻辑:

@Override
   public int compareTo(Student o) {
       int i = this.age - o.age;
       Collator instance = Collator.getInstance(Locale.CHINESE);//因为值可能为汉字所以使用Collator静态方法,对汉字进行比较方法
       i=i==0?instance.compare(this.name,o.name):i;
       return -i;//因为要从大到小,而默认规则是负数存左边,正数存右边,排序规则根据返回值而定的,所以直接加减负可以直接改变大小原则
  }
测试类:
 class Demo {
   public static void main(String[] args) {
       Student s1 = new Student("张三", 23);
       Student s2 = new Student("李四", 24);
       Student s3 = new Student("王五", 25);
       Student s4 = new Student("赵六", 26);
       TreeMap<Student, String> ts = new TreeMap<>();
       ts.put(s1, "北京");
       ts.put(s2, "上海");
       ts.put(s3, "广东");
       ts.put(s4, "深圳");
       Set<Student> keySet = ts.keySet();
try {
           for (Student key : keySet) {
               //使用代码删除张三的信息
               // 此时我们并没有使用迭代器删除方式,直接调用TreeMap集合方法进行了删除
               //但是只能删除从大到小排序规则的集合,不可以删除从小到大规则排序的集合
               if (key.getName().equals("张三")) {
                   ts.remove(key);

              }
          }
      } catch (Exception e) {
           System.out.println("删除失败!违背了迭代器原理!可以试试集合倒着写");
      }
       for (Student key : keySet) {

           //使用代码修改李四的家庭住址为郑州
           if (key.getName().equals("李四")) {
               //增强for方法底层是迭代器遍历方式,不能修改set集合元素,
               // 而我们修改的是treeMap,所以并没有违背迭代器不能修改的原则
               ts.put(key, "郑州");
               System.out.println("修改成功");
          }
      }
     
       System.out.println(ts);
       System.out.println("遍历一:");
       for (Student key : keySet) {
           String value = ts.get(key);
           System.out.println(key.getAge() + "岁的" + key.getName() + "," + value);
      }
  }

}

方式二:利用迭代器进行修改和删除

总结:

迭代器删除无论顺序是从小到大还是从大到小,都能进行修改和删除

修改对顺序没有特殊要求,修改可以使用迭代器,也可以直接使用增强for进行修改

排序关键代码逻辑:
@Override
   public int compareTo(Student o) {
       int i = this.age - o.age;
       Collator instance = Collator.getInstance(Locale.CHINESE);//因为值可能为汉字所以使用Collator静态方法,对汉字进行比较方法
       i=i==0?instance.compare(this.name,o.name):i;
       return i;
       //return i;//因为要从大到小,而默认规则是负数存左边,正数存右边,排序规则根据返回值而定的,所以直接加减负可以直接改变大小原则
  }

测试类:

 class Demo1 {
   public static void main(String[] args) {
       Student s1 = new Student("张三", 23);
       Student s2 = new Student("李四", 24);
       Student s3 = new Student("王五", 25);
       Student s4 = new Student("赵六", 26);
       TreeMap<Student, String> ts = new TreeMap<>();
       ts.put(s1, "北京");
       ts.put(s2, "上海");
       ts.put(s3, "广东");
       ts.put(s4, "深圳");
       Set<Student> keySet = ts.keySet();
//迭代器删除方式,删除key的姓名为李四的键值对
       Iterator<Student> iterator1 = keySet.iterator();
       while (iterator1.hasNext()) {
           Student key = iterator1.next();
           if (key.getName().equals("李四")) {
               iterator1.remove();//此时注意是用的迭代器的删除方法,而不是Map集合的删除方法,使用Map集合删除方法,此处会报错
          }
      }
       //修改方式一:
       //迭代器修改方式,将张三的值修改为郑州
       Iterator<Student> iterator = keySet.iterator();
       while (iterator.hasNext()) {
           Student key = iterator.next();
           if (key.getName().equals("张三")) {
               ts.put(key, "郑州");
               System.out.println("修改成功");
               
          }
      }
       //bug代码:
       /*
       Iterator<Student> iterator = keySet.iterator();
       while (iterator.hasNext()) {
           if (iterator.next().getName().equals("张三")) {
               ts.put(iterator.next(), "郑州");
           }//此逻辑不会编译报错,运行也不报错,但是逻辑不通,,但是会修改到下一个key的值,迭代器的默认指向下一个原理
       }*/
       
        /*
        //修改方式二,增强for修改
        for (Student key : keySet) {
           if (key.getName().equals("张三")){
               ts.put(key,"郑州");
               System.out.println("修改成功");
           }
       }
       */
       System.out.println(ts);
       System.out.println("遍历:");
       for (Student key : keySet) {
           String value = ts.get(key);
           System.out.println(key.getAge() + "岁的" + key.getName() + "," + value);
      }

  }
}
运行效果:

TreeMap集合根据指定元素,进行删除和修改的两种方式实现及bug梳理的更多相关文章

  1. 使用jQuery编辑删除页面内容,两种方式

    第一种,比较少的编辑用这种,直接在那块内容上编辑,失去焦点即完成 前几天做编辑框的时候,需要只修改一个状态 //编辑角色 function editTr($this){ thatTd=$($this) ...

  2. tomcat 指定(自定义)JDK路径的两种方式

      1.情景展示 tomcat7使用jdk1.7:tomcat8使用jdk1.8.两个tomcat在一台机器下同时启动,你会发现这两个tomcat使用的是一个版本的jdk, 那就是你配置过的JAVA_ ...

  3. C# 恢复工作空间,删除Unversioned文件,两种方式

    //通过命令行清理svn的工作空间,删除未add的文件,revert修改的文件 public static bool RevertDelUnversioned(string svnPath) { tr ...

  4. Dev控件删除按钮的两种方式

    测试版本15.2.10:在Dev控件中删除按钮空间有两种方式:1.鼠标右键出现Delete选项,这种删除是不完全的删除,只是删除了按钮的显示,实际上按钮还是存在于代码中的.2.用键盘上的Delete键 ...

  5. Map集合的遍历方式以及TreeMap集合保存自定义对象实现比较的Comparable和Comparator两种方式

    Map集合的特点 1.Map集合中保存的都是键值对,键和值是一一对应的 2.一个映射不能包含重复的值 3.每个键最多只能映射到一个值上 Map接口和Collection接口的不同 Map是双列集合的根 ...

  6. java的取出map里所有元素的两种方式

    /* * 取出map元素的两种方式 */package com.map.test; import java.util.HashMap;import java.util.Iterator;import ...

  7. 遍历Map集合:java.util.Map.Entry、KeySet两种方式

    遍历Map集合的两种方式: 1.用KeySet Map.keySet(),返回一个存放所有key的set集合,通过遍历集合,根据key值取出所有的value值. Map<String,Strin ...

  8. 转载:删除github上文件夹的两种方式

    http://www.jianshu.com/p/286be61bb9b8 删除github上文件夹的两种方式(解决已经加入ignore的文件夹无法从远程仓库删除的问题) 如果此文件夹已被加入git追 ...

  9. oracle删除表数据的两种的方式

    转自:https://blog.csdn.net/qq_37840993/article/details/82490787 平时写sql中我们都会用到删除语句,而平时删除表数据的时候我们经常会用到两种 ...

随机推荐

  1. Springboot整合WebSocket实现网页版聊天,快来围观!

  2. VisualStudio 编写汇编代码相关设置

    VS编写汇编代码方法 新建空项目,不创建解决方案 项目右键,Build Customizations,选择masm 新建源文件,后缀为.ASM 编写代码 .386 ; Tells MASM to us ...

  3. Android面试题《思考与解答》11月刊

    又来更新啦,Android面试题<思考与解答>11月刊奉上. 说说View/ViewGroup的绘制流程 View的绘制流程是从ViewRoot的performTraversals开始的, ...

  4. Beta冲刺随笔——Day_Three

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Beta冲刺 作业正文 正文 其他参考文献 无 今日事今日毕 林涛: ...

  5. 三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境

    写在前面 最近在 K8S 1.18.2 版本的集群上搭建DevOps环境,期间遇到了各种坑.目前,搭建环境的过程中出现的各种坑均已被填平,特此记录,并分享给大家! 文章和搭建环境所需要的yml文件已收 ...

  6. go语言的指针类型

    一.指针与引用的相关概念 什么是指针? 指针,全称为指针变量,是用来存储内存地址的一种变量.程序中,一般通过指针来访问其指向的内存地址中的内容(数据). 什么是引用? 引用,是C++中提出来的一种新的 ...

  7. 【原创】Linux虚拟化KVM-Qemu分析(七)之timer虚拟化

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...

  8. 第10章 Python的模块和包

    前面几章介绍的Python基础知识,相关案例都是以单源代码文件为例来说明的,这种单源代码文件在Python中就是模块,每个模块文件都可以被其他应用导入,Python正是通过模块导入技术来实现很灵活的功 ...

  9. 常见SQL注入点判断

    sql注入手工检测 SQL注入手工检测 1基本检测 数字型 字符型 搜索型 POST注入 布尔盲注 报错注入 堆叠注入 判断是什么数据库 2绕过技巧 大小写 替换关键字 使用编码 注释和符号 等价函数 ...

  10. 利用flask框架实现对用户的注册登录

    ------------------------------------(分割线)----------------------------------------------------------- ...