首先要明确的一点是java中原生的Set和Map是不具备排序能力的,即在遍历时是无顺序的。而 SortedSet和SortedMap接口提供了Set和Map的排序功能。 注意两者是接口。

1. SortedSet接口

(1) 实例

直接来看例子:

package ecnu.cn;import java.util.*;public class MyTest {public static class MyClass {Integer x;String y;public MyClass(Integer x, String y) {this.x = x;this.y = y;}public Integer getX() {return x;}public String getY() {return y;}}public static void main(String[] args) {// 定义SortedSet并重写compare函数SortedSet<MyClass> set = new TreeSet<MyClass>(new Comparator<MyClass>() {@Overridepublic int compare(MyClass o1, MyClass o2) {// return o1.getX() - o2.getX();return o1.getY().compareTo(o2.getY());}});// 添加元素MyClass clzz1 = new MyClass(1, "345");MyClass clzz2 = new MyClass(8, "567");MyClass clzz3 = new MyClass(3, "123");MyClass clzz4 = new MyClass(5, "433");MyClass clzz5 = new MyClass(2, "754");set.add(clzz1);set.add(clzz2);set.add(clzz3);set.add(clzz4);set.add(clzz5);Iterator iterator = set.iterator();while (iterator.hasNext()) {MyClass clzz = (MyClass) iterator.next();System.out.println("x: " + clzz.getX() + "  y: " + clzz.getY());}System.out.println("\nfirst: " + set.first().getX() + "  " + set.first().getY());System.out.println("last: " + set.last().getX() + "  " + set.last().getY());SortedSet<MyClass> headSet = set.headSet(clzz4);SortedSet<MyClass> subSet = set.subSet(clzz1, clzz2);SortedSet<MyClass> tailSet = set.tailSet(clzz4);System.out.println("\nheadSet:");for (MyClass myClass : headSet) {System.out.println("x: " + myClass.getX() + "  y: " + myClass.getY());}System.out.println("\nsubSet:");for (MyClass myClass : subSet) {System.out.println("x: " + myClass.getX() + "  y: " + myClass.getY());}System.out.println("\ntailSet:");for (MyClass myClass : tailSet) {System.out.println("x: " + myClass.getX() + "  y: " + myClass.getY());}}
}

其对应的输出为:

x: 3  y: 123
x: 1  y: 345
x: 5  y: 433
x: 8  y: 567
x: 2  y: 754first: 3  123
last: 2  754headSet:
x: 3  y: 123
x: 1  y: 345subSet:
x: 1  y: 345
x: 5  y: 433tailSet:
x: 5  y: 433
x: 8  y: 567
x: 2  y: 754

由于SortedSet是一个接口,为了简单起见直接使用了它的实现类TreeSet来进行实验。如果是String等类型的SortedSet的话,是不需要重写Comparator方法的,而上例中使用了自己的类,所以需要重写。

(2) 常用方法

SortedSet的常用方法主要有以下几种:

  • comparator():比较器,按照用户指定的规则对元素排序
  • first():第一个元素
  • last():最后一个元素
  • headSet(E e):e之前的元素,不包括e(也可以理解为左闭右开)
  • subSet(E e1, E e2):e1和e2之间的元素,左闭右开
  • tailSet(E e):e之后的元素,包括e(也可以理解为左闭右开)

2. SortedMap接口

(1) 实例

也是直接看例子:

package ecnu.cn;import java.util.*;public class MyTest {public static void main(String[] args) {// 定义SortedSet并重写compare函数SortedMap<Integer, String> map = new TreeMap<>();map.put(3, "345");map.put(1, "567");map.put(5, "123");map.put(8, "433");map.put(2, "754");for (Integer key : map.keySet()) {System.out.println("key: " + key + " value: " + map.get(key));}System.out.println("\nfirst: " + map.firstKey());System.out.println("last: " + map.lastKey());final SortedMap<Integer, String> headMap = map.headMap(3);final SortedMap<Integer, String> subMap = map.subMap(2, 5);final SortedMap<Integer, String> tailMap = map.tailMap(3);System.out.println("\nheadMap:");for (Integer key : headMap.keySet()) {System.out.println("key: " + key + "  value: " + headMap.get(key));}System.out.println("\nsubMap:");for (Integer key : subMap.keySet()) {System.out.println("key: " + key + "  value: " + subMap.get(key));}System.out.println("\ntailMap:");for (Integer key : tailMap.keySet()) {System.out.println("key: " + key + "  value: " + tailMap.get(key));}}
}

其输出为:

key: 1 value: 567
key: 2 value: 754
key: 3 value: 345
key: 5 value: 123
key: 8 value: 433first: 1
last: 8headMap:
key: 1  value: 567
key: 2  value: 754subMap:
key: 2  value: 754
key: 3  value: 345tailMap:
key: 3  value: 345
key: 5  value: 123
key: 8  value: 433

由于SortedMap是一个接口,为了简单起见直接使用了它的实现类TreeMap来进行实验。SortedMap会自动根据key进行升序排序。可以和SortedSet类似重写Comparator方法来按照指定的方式(只能指定按key排序)进行排序。

(2) 常用方法

SortedMap的常用方法主要有以下几种:

  • comparator():比较器,按照用户指定的规则对元素排序
  • first():第一个元素
  • last():最后一个元素
  • headMap(K k):键k之前的元素,不包括k(也可以理解为左闭右开)
  • subMap(K k1, K k2):键k1和k2之间的元素,左闭右开
  • tailMap(K k):键k之后的元素,包括k(也可以理解为左闭右开)

【java笔记】有序集合SortedSet和有序映射SortedMap的使用相关推荐

  1. Redis数据类型使用场景及有序集合SortedSet底层实现详解

    Redis常用数据类型有字符串String.字典dict.列表List.集合Set.有序集合SortedSet,本文将简单介绍各数据类型及其使用场景,并重点剖析有序集合SortedSet的实现. Li ...

  2. Redis 基础 -- 有序集合 SortedSet类型 和 SortedSet类型的常用命令

    文章目录 1. 有序集合(SortedSet) 1.1 ZADD:添加或更新成员 1.1.1 更新已有成员的分值 1.1.2 指定要执行的操作 1.1.3 返回被修改成员的数量 1.1.4 时间复杂度 ...

  3. 对 Redis 中的有序集合SortedSet的理解

    本篇说一下Redis中的 有序集合类型,曾几何时,我们想把所有数据存到内存中的 数据结构 中,但为了多机器共享内存,不得不将这块内存包装成wcf单独部署,同时还要考虑怎么序列化,烦心事太多太多...后 ...

  4. 【Java笔记】集合(Collection接口)的使用

    面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.使用 Array 存储对象方面具有一些弊端,而 Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中 ...

  5. Java笔记06-Map集合

    Map集合 学习目标 能够说出Map集合特点 使用Map集合添加方法保存数据 使用"键找值"的方式遍历Map集合 使用"键值对"的方式遍历Map集合 能够使用H ...

  6. Java笔记-concurrent集合及线程池

    reentrantLock + condition实现 Blocking queue. java.util.concurrent提供了线程安全的Blocking集合:ArrayBlockingQueu ...

  7. Redis 集合 有序集合 python操作集合

    集合数据类型(set) 文章目录 集合数据类型(set) 基本命令 案例: 新浪微博的共同关注 python操作set 有序集合sortedset 特点 有序集合常用命令 python操作sorted ...

  8. redis实战_Redis实战(7)-SortedSet实战之认识有序集合(命令行与代码实战)

    缓存中间件Redis拥有许多丰富.重要且有趣的数据结构,前文介绍的字符串String.列表List和集合Set便是其中的佼佼者,本文以及后续篇章介绍的有序集合SortedSet和哈希Hash数据结构亦 ...

  9. [Redis6]常用数据类型_Zset有序集合

    Zset有序集合 简介 Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合. 不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按 ...

最新文章

  1. 国内首部高尔夫商战小说《手腕》(林健锋著)
  2. sprintboot-learn(一)
  3. 【星球知识卡片】视频分类与行为识别有哪些核心技术,对其进行长期深入学习...
  4. 电路邱关源第五版pdf_硬件狗教你学电路【二】:电路分析方法
  5. 知识图谱最新权威综述论文解读:时序知识图谱部分
  6. python判断是否为素数_python判断是否为素数
  7. Android Service 的重启
  8. 【设计模式】建造者模式(生成器模式)
  9. EXCEL 分列功能的使用
  10. 投资中的黑科技知多少?
  11. 简易学生管理系统(C语言)
  12. bitset java 源码_【JAVA】BitSet的源码研究
  13. 求实数的整数部分和小数部分python_python求实数的整数部分
  14. 少模光纤模式场的计算
  15. 【错误率、精度、查准率、查全率和F1度量】详细介绍
  16. 达威尔液晶电子手写板儿童涂鸦画板写字板,培养小孩创造力和想象力的好工具!
  17. 4246. 【五校联考6day2】san
  18. CSS实现两行input框样式
  19. 网页版数据库管理工具安装教程——phpAdmin
  20. 2022年必看的18个HR面面试题是这些【值得收藏】

热门文章

  1. chrome谷歌浏览器如何让网站可以自动播放音乐
  2. 微信JS-SDK 微信分享接口开发(介绍版)
  3. 模板方法模式与策略模式
  4. 好妈妈【第二章】把学习做成轻松的事,父母如何提升孩子的学习成绩
  5. hint: The ‘.git/hooks/pre-commit‘ hook was ignored because it‘s not set as executable.
  6. Hexo博客加时间线timeline功能
  7. 【转】从隐私到隐私计算
  8. html中的div怎么隐藏显示出来,HTML中多个DIV层如何隐藏和显示?
  9. 全国各级计算机等级证书的区别
  10. “姚期智版”L4级水上无人驾驶游船首航成功,你想去坐坐么?