Java集合框架(十二):SortedMap 源码分析

拼搏现实的明天。 2022-02-20 14:26 832阅读 0赞

文章目录

    • 1、SortedMap 简述
    • 2、SortedMap 类图
    • 3、SortedMap 方法说明
    • 4、SortedMap 应用示例
      • 4.1、SortedMap 构造函数示例
        • 4.1.1、无参构造函数
        • 4.1.2、具有 Comparator 的构造函数
        • 4.1.3、参数为 Map 类型的构造函数
        • 4.1.4、参数为 SortedMap 类型的构造函数
      • 4.2、SortedMap 方法示例

1、SortedMap 简述

SortedMap 接口扩展了 Map 接口并提供了有序的Map实现,SortedMap 的排序方式有两种:根据键值的自然顺序排序和指定比较器(Comparator)排序。插入有序的 SortedMap 的所有元素都必须实现Comparable接口

所有通用的有序映射实现类都应该提供四个“标准”构造函数:

  1. 一个void(无参数)构造函数,它根据键的自然顺序创建一个空的有序映射。
  2. 具有Comparator类型的单个参数的构造函数,它创建根据指定的比较器排序的空的有序映射。
  3. 具有Map类型的单个参数的构造函数,它创建一个具有与其参数相同的 key-value 映射的新映射,并根据键的自然顺序进行排序。
  4. 具有SortedMap类型的单个参数的构造函数,它创建一个新的有序映射,其具有相同的 key-value 映射和与输入有序映射相同的顺序。

在这里插入图片描述

2、SortedMap 类图

在这里插入图片描述

父接口:

Map

所有已知子接口:

ConcurrentNavigableMap, NavigableMap

所有已知实现类:

ConcurrentSkipListMap, TreeMap

3、SortedMap 方法说明

1、Comparator<? super K> comparator():
返回用于对此映射中的键进行排序的比较器;如果此映射使用其键的自然顺序,则返回null。

2、SortedMap subMap(K fromKey, K toKey):

返回此映射部分的视图,其键的范围从fromKey(包括)到 toKey(不包括)。 (如果fromKey和 toKey 相等,则返回的视图为空。)

当尝试在返回的映射范围之外插入键时,将会抛出 IllegalArgumentException。

3、SortedMap headMap(K toKey):

返回此映射的部分视图,其键的范围小于 toKey。

4、SortedMap tailMap(K fromKey):

返回此映射的部分视图,其键的范围大于等于fromKey。

5、K firstKey():

返回此映射中当前的第一个键。

6、K lastKey():

返回此映射中当前的最后一个键。

7、Set keySet():

返回此映射中所有键的 Set 视图。 set的迭代器按升序返回键。

如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未知的。 该集合支持元素删除,它支持通过 Iterator.remove,Set.remove,removeAll,retainAll 和 clear 操作从视图中删除相应的映射。 它不支持add或addAll操作。

8、Collection values():

返回此映射中包含的值的Collection视图。 集合的迭代器以相应键的升序返回值。

如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未知的。 该集合支持元素删除,它支持通过 Iterator.remove,Set.remove,removeAll,retainAll 和 clear 操作从视图中删除相应的映射。 它不支持add或addAll操作。

9、Set> entrySet():

返回此映射中包含的映射的Set>视图。 set的迭代器以升序键顺序返回条目。

如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未知的。 该集合支持元素删除,它支持通过 Iterator.remove,Set.remove,removeAll,retainAll 和 clear 操作从视图中删除相应的映射。 它不支持add或addAll操作。

4、SortedMap 应用示例

以下示例需要使用的对象如下

  1. public class PersonDetail {
  2. String name;
  3. LocalDate birthday;
  4. String address;
  5. public PersonDetail(String name, LocalDate birthday, String address) {
  6. this.name = name;
  7. this.birthday = birthday;
  8. this.address = address;
  9. }
  10. @Override
  11. public String toString() {
  12. return this.name + ", from " + this.address;
  13. }
  14. }

4.1、SortedMap 构造函数示例

4.1.1、无参构造函数

按照key的自然顺序排序

  1. private static void method1() {
  2. //key的自然顺序排序
  3. SortedMap<String, PersonDetail> personMap = new TreeMap<>();
  4. personMap.put("zhangsan", new PersonDetail("张三", LocalDate.of(1998, 6, 22), "小胡同3号"));
  5. personMap.put("lisi", new PersonDetail("李四", LocalDate.of(1996, 2, 2), "小胡同8号"));
  6. personMap.put("wanger", new PersonDetail("王二", LocalDate.of(2010, 12, 11), "小胡同28号"));
  7. personMap.forEach((key, value) -> System.out.println(key + " -> " + value));
  8. }

输出结果:

  1. lisi -> 李四, from 小胡同8
  2. wanger -> 王二, from 小胡同28
  3. zhangsan -> 张三, from 小胡同3

4.1.2、具有 Comparator 的构造函数

我们编写一个lambda表达式来提供Comparator接口的compareTo实现。 假设我们希望按照key长度按降序对key进行排序

  1. private static void method1() {
  2. //key的长度排序
  3. SortedMap<String, PersonDetail> personMap = new TreeMap<>((s1, s2) -> s2.length() - s1.length());
  4. personMap.put("zhangsan", new PersonDetail("张三", LocalDate.of(1998, 6, 22), "小胡同3号"));
  5. personMap.put("lisi", new PersonDetail("李四", LocalDate.of(1996, 2, 2), "小胡同8号"));
  6. personMap.put("wanger", new PersonDetail("王二", LocalDate.of(2010, 12, 11), "小胡同28号"));
  7. personMap.forEach((key, value) -> System.out.println(key + " -> " + value));
  8. }

输出结果:

  1. zhangsan -> 张三, from 小胡同3
  2. wanger -> 王二, from 小胡同28
  3. lisi -> 李四, from 小胡同8

4.1.3、参数为 Map 类型的构造函数

  1. private static void method2() {
  2. //普通map
  3. Map<String, PersonDetail> generalMap = new HashMap<>();
  4. generalMap.put("lilei", new PersonDetail("李雷", LocalDate.of(1994, 6, 22), "1号大街"));
  5. generalMap.put("hanmeimei", new PersonDetail("韩梅梅", LocalDate.of(1995, 2, 2), "2号大街"));
  6. generalMap.put("zhangmeili", new PersonDetail("张美丽", LocalDate.of(2010, 12, 11), "3号大街"));
  7. //普通map作为SortedMap构造函数的参数
  8. SortedMap<String, PersonDetail> sortedMap = new TreeMap<>(generalMap);
  9. System.err.println("普通map作为SortedMap构造函数的参数:");
  10. sortedMap.forEach((key, value) -> System.out.println(key + " -> " + value));
  11. }

输出结果:

  1. 普通map作为SortedMap构造函数的参数:
  2. hanmeimei -> 韩梅梅, from 2号大街
  3. lilei -> 李雷, from 1号大街
  4. zhangmeili -> 张美丽, from 3号大街

4.1.4、参数为 SortedMap 类型的构造函数

  1. private static void method2() {
  2. //指定比较器的map
  3. Map<String, PersonDetail> sortedComparetorMap = new TreeMap<>((s1, s2) -> s2.length() - s1.length());
  4. sortedComparetorMap.put("lilei", new PersonDetail("李雷", LocalDate.of(1994, 6, 22), "1号大街"));
  5. sortedComparetorMap.put("hanmeimei", new PersonDetail("韩梅梅", LocalDate.of(1995, 2, 2), "2号大街"));
  6. sortedComparetorMap.put("zhangmeili", new PersonDetail("张美丽", LocalDate.of(2010, 12, 11), "3号大街"));
  7. System.err.println("指定比较器的有序map作为SortedMap构造函数的参数:");
  8. SortedMap<String, PersonDetail> newMap = new TreeMap<>(sortedComparetorMap);
  9. newMap.forEach((key, value) -> System.out.println(key + " -> " + value));
  10. }

输出结果:

  1. 指定比较器的有序map作为SortedMap构造函数的参数:
  2. hanmeimei -> 韩梅梅, from 2号大街
  3. lilei -> 李雷, from 1号大街
  4. zhangmeili -> 张美丽, from 3号大街

4.2、SortedMap 方法示例

  1. private static void method3() {
  2. SortedMap<String, PersonDetail> personMap = new TreeMap<>((s1, s2) -> s2.length() - s1.length());
  3. personMap.put("zhangsan", new PersonDetail("张三", LocalDate.of(1998, 6, 22), "小胡同3号"));
  4. personMap.put("lisi", new PersonDetail("李四", LocalDate.of(1996, 2, 2), "小胡同8号"));
  5. personMap.put("wanger", new PersonDetail("王二", LocalDate.of(2010, 12, 11), "小胡同28号"));
  6. System.out.println("映射关系如下:===================");
  7. personMap.forEach((key, value) -> System.out.println(key + " -> " + value));
  8. System.out.println("===================");
  9. System.out.println("entrySet:" + personMap.entrySet());
  10. System.out.println("firstKey:" + personMap.firstKey());
  11. System.out.println("lastKey:" + personMap.lastKey());
  12. System.out.println("keySet:" + personMap.keySet());
  13. System.out.println("values:" + personMap.values());
  14. System.out.println("headMap:" + personMap.headMap("wanger"));
  15. System.out.println("tailMap:" + personMap.tailMap("wanger"));
  16. }

输出结果:

  1. 映射关系如下:===================
  2. zhangsan -> 张三, from 小胡同3
  3. wanger -> 王二, from 小胡同28
  4. lisi -> 李四, from 小胡同8
  5. ===================
  6. entrySet:[zhangsan=张三, from 小胡同3号, wanger=王二, from 小胡同28号, lisi=李四, from 小胡同8号]
  7. firstKey:zhangsan
  8. lastKey:lisi
  9. keySet:[zhangsan, wanger, lisi]
  10. values:[张三, from 小胡同3号, 王二, from 小胡同28号, 李四, from 小胡同8号]
  11. headMap("wanger"):{zhangsan=张三, from 小胡同3号}
  12. tailMap("wanger"):{wanger=王二, from 小胡同28号, lisi=李四, from 小胡同8号}

发表评论

表情:
评论列表 (有 0 条评论,832人围观)

还没有评论,来说两句吧...

相关阅读