首页 > 其他 > 详细

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

时间:2020-12-26 11:44:04      阅读:55      评论:0      收藏:0      [点我收藏+]

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梳理

原文:https://www.cnblogs.com/859630097com/p/14191270.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!