TreeMap是最近遇到的,它可以根据key值自动排序,默认状态是对key进行递增排序,也可以自定义

treemap的存放顺序和实际位置并不相同,算是无序集合

treemap的常用 方法在下面 (转载)

public class TreeMapTest {public static void main(String[] agrs){//创建TreeMap对象:TreeMap<String,Integer> treeMap = new TreeMap<String,Integer>();System.out.println("初始化后,TreeMap元素个数为:" + treeMap.size());//新增元素:treeMap.put("hello",1);treeMap.put("world",2);treeMap.put("my",3);treeMap.put("name",4);treeMap.put("is",5);treeMap.put("huangqiuping",6);treeMap.put("i",6);treeMap.put("am",6);treeMap.put("a",6);treeMap.put("developer",6);System.out.println("添加元素后,TreeMap元素个数为:" + treeMap.size());//遍历元素:Set<Map.Entry<String,Integer>> entrySet = treeMap.entrySet();for(Map.Entry<String,Integer> entry : entrySet){String key = entry.getKey();Integer value = entry.getValue();System.out.println("TreeMap元素的key:"+key+",value:"+value);}//获取所有的key:Set<String> keySet = treeMap.keySet();for(String strKey:keySet){System.out.println("TreeMap集合中的key:"+strKey);}//获取所有的value:Collection<Integer> valueList = treeMap.values();for(Integer intValue:valueList){System.out.println("TreeMap集合中的value:" + intValue);}//获取元素://获取集合内元素key为"huangqiuping"的值Integer getValue = treeMap.get("huangqiuping");//获取集合内第一个元素String firstKey = treeMap.firstKey();//获取集合内最后一个元素String lastKey =treeMap.lastKey();//获取集合内的key小于"huangqiuping"的keyString lowerKey =treeMap.lowerKey("huangqiuping");//获取集合内的key大于等于"huangqiuping"的keyString ceilingKey =treeMap.ceilingKey("huangqiuping");//获取集合的key从"a"到"huangqiuping"的元素SortedMap<String,Integer> sortedMap =treeMap.subMap("a","my");//删除元素://删除集合中key为"huangqiuping"的元素Integer removeValue = treeMap.remove("huangqiuping");//清空集合元素:treeMap.clear(); //判断方法://判断集合是否为空boolean isEmpty = treeMap.isEmpty();//判断集合的key中是否包含"huangqiuping"boolean isContain = treeMap.containsKey("huangqiuping");}
}

排序,和自定义排序如下(转载)

public class SortedTest implements Comparable<SortedTest> {private int age;public SortedTest(int age){this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//自定义对象,实现compareTo(T o)方法:public int compareTo(SortedTest sortedTest) {int num = this.age - sortedTest.getAge();//为0时候,两者相同:if(num==0){return 0;//大于0时,传入的参数小:}else if(num>0){return 1;//小于0时,传入的参数大:}else{return -1;}}
}public class TreeMapTest {public static void main(String[] agrs){//自然顺序比较naturalSort();}//自然排序顺序:public static void naturalSort(){//第一种情况:Integer对象TreeMap<Integer,String> treeMapFirst = new TreeMap<Integer, String>();treeMapFirst.put(1,"huangqiuping");treeMapFirst.put(6,"huangqiuping");treeMapFirst.put(3,"huangqiuping");treeMapFirst.put(10,"huangqiuping");treeMapFirst.put(7,"huangqiuping");treeMapFirst.put(13,"huangqiuping");System.out.println(treeMapFirst.toString());//第二种情况:SortedTest对象TreeMap<SortedTest,String> treeMapSecond = new TreeMap<SortedTest, String>();treeMapSecond.put(new SortedTest(10),"huangqiuping");treeMapSecond.put(new SortedTest(1),"huangqiuping");treeMapSecond.put(new SortedTest(13),"huangqiuping");treeMapSecond.put(new SortedTest(4),"huangqiuping");treeMapSecond.put(new SortedTest(0),"huangqiuping");treeMapSecond.put(new SortedTest(9),"huangqiuping");System.out.println(treeMapSecond.toString());}
}

TreeMap不仅可以自定义排序,可以让元素放进来以后变得有序,也可以利用二分法对最近的元素进行查找,如最近的比其小的元素,和最近的比其大的元素。这个API可以应用到很多题目上去,下面给出例题。

这里就需要treeMap的API了

代码如下

class MyCalendar {TreeMap<Integer, Integer> treeMap;public MyCalendar() {treeMap = new TreeMap<>();}public boolean book(int start, int end) {if (treeMap.isEmpty()) {treeMap.put(start, end);return true;}
//寻找左边最近的元素Map.Entry<Integer, Integer> floorEntry = treeMap.floorEntry(start);
//寻找右边最近的元素Map.Entry<Integer, Integer> ceilingEntry = treeMap.ceilingEntry(start);if (floorEntry != null && floorEntry.getValue() > start) {return false;}if (ceilingEntry != null && ceilingEntry.getKey() < end) {return false;}
//添加元素,由treemap内部进行自动排序treeMap.put(start, end);return true;}
}

Treeset也是一个道理,不过它是作为set。

类似的题目如下所示

即采用滑动窗口的形式,当添加新元素时,将其与集合内相邻的两个元素进行比较,如果符合条件则为true,这里就需要用到treeset的自动排序功能(至于底层如何排序的具体再学)

代码如下所示

class Solution {public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {TreeSet<Integer> treeSet = new TreeSet<>();for (int i = 0; i < nums.length; i++) {Integer cur = nums[i];// 寻找比cur小的最大数和比cur大的最小数,查找 l->cur 和 cur->r 范围Integer l = treeSet.floor(cur);Integer r = treeSet.ceiling(cur);if (l != null && (long) cur - l <= t) return true;if (r != null && (long) r - cur <= t) return true;treeSet.add(cur);// 维持一个大小为 k 的滑动窗口if (i >= k) treeSet.remove(nums[i - k]);}return false;}
}

TreeMap和TreeSet相关推荐

  1. Treemap and Treeset java 实现

    引自:  http://www.ibm.com/developerworks/cn/java/j-lo-tree/(红黑树部分 详见这里) 对于 TreeMap 而言,它采用一种被称为"红黑 ...

  2. 小汤学编程之JAVA基础day11——集合框架:List/Set/Map集合、Collections集合工具类、泛型、TreeMap和TreeSet

    一.集合的特点 二.继承结构图 三.List集合 1.特点     2.ArrayList类     3.LinkedList类     4.两者的对比     5.集合的遍历 四.Set集合 1.特 ...

  3. TreeMap与TreeSet(初步了解)

    日升时奋斗,日落时自省 目录 一.Map和Set 1.搜索树的基本概念 2.二叉搜索查找 3.二叉搜索树插入 4.二叉搜索树删除 二.TreeMap 三.TreeSet 一.Map和Set Map/S ...

  4. HashMap,HashTable,TreeMap,HashSet,TreeSet

    注意:最好先看一下(三)中 树红黑树的数据结构分析,可以的话数组,链表的数据结构也先复习一下,这里默认你懂数组,链表 2.2 map Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对 ...

  5. java学习:容器排序:TreeMap和TreeSet实现自定义排序的使用方法?两者的区别?

    文章目录 TreeMap和TreeSet实现自定义排序的实现 1.TreeMap实现自定义排序 (1)构造函数中new Comparator,匿名内部类,重写compare 方法. (2)实体类实现C ...

  6. Java TreeMap 和 TreeSet 源码解析

    A Red-Black tree based {@link NavigableMap} implementation. The map is sorted according to the {@lin ...

  7. Java中TreeMap和TreeSet的底层实现

    TreeSet底层则采用NavigableMap这个接口来保存TreeSet集合,而实际上NavigableMap只是一个接口,实际上TreeSet还是用TreeMap来保存set元素. TreeSe ...

  8. 线程安全的HashMap,TreeMap,ArrayList,TreeSet,Set

    1.线程安全的集合:集合类中,用于实现线程安全的有两种办法,一种是使用Collections.synchronizedList来替代ArrayList 具体的API如下图: 但是该类会出现并发异常:代 ...

  9. TreeMap、TreeSet简介

    TreeMap TreeMap底层采用红黑树保存每个Entry对象,红黑树是一种自平衡排序二叉树. TreeMap添加元素源码: public V put(K key, V value) {// 获取 ...

最新文章

  1. 磁盘I:O 性能指标 以及 如何通过 fio 对nvme ssd,optane ssd, pmem 性能摸底
  2. App功能测试的注意点
  3. Eclipse error: “The import XXX cannot be resolved”
  4. 《算法竞赛入门经典》第三章 3.4
  5. Hyper-V虚拟机自动添加检查点和导出备份
  6. 考试用计算机反思800字,考试反思作文800字
  7. root用户Linux 环境变量的配置解决(-bash: jps: command not found)有关问题
  8. Springboot 拦截器配置(登录拦截)
  9. 【性能测试】:操作NMON的shell脚本
  10. 极客大学架构师训练营-架构师技术图谱-大作业二
  11. 让Safari更好用,10款实用Safari扩展推荐
  12. 低代码平台对程序员产生的内卷,零代码、低代码系列之一「对于零代、低代码平台的思考」
  13. AVR单片机学习笔记
  14. C语言实现推箱子游戏
  15. 九月亲测可运营【付费视频奖励计划赞助视频付费计划】最新版本的视频奖励源代码带有订阅可扣除金额带有代理新UI ...
  16. 移动硬盘linux双系统,在移动硬盘安装Linux(Ubuntu)双系统
  17. 蓝牙耳机厂家新品发布——ANC主动降噪耳机U2065
  18. Arduino学习(六) 继电器实验
  19. 时间序列中Hurst指数的计算(python代码)
  20. 【每日一练】56—CSS实现一款实用的响应式卡片悬停效果

热门文章

  1. option标签的默认值设置
  2. NOIP 2012 Senior 2 - 国王游戏
  3. java date类 时区_Java Date 与时区
  4. 2020年4月份DB-Engines数据库最新排名
  5. 上海电机学院计算机科学与技术专业怎么样,上海电机学院计算机科学与技术专业2016年在上海理科高考录取最低分数线...
  6. 助力全球抗疫,腾讯加入Linux基金会公共卫生计划
  7. 计算机网络自顶向下方法 第三章 作业习题答案
  8. excel中文件合并F9键
  9. Vue之 解决下拉框默认选中的是数字key 不是汉字value值
  10. 什么是运动控制,工业控制与自动化领域中运动控制器的作用是什么?- 顶控科技