Core Java Tutorial -- SortedMap

朱雀 2022-05-28 00:50 677阅读 0赞

Java SortedMap 是一个提供了在键上完全排序的 Map。

  1. Java SortedMap
  1. 1. Java SortedMap Constructors
  2. 2. Java SortedMap implementation
  3. 3. Java SortedMap Methods Compared to Map

Java SortedMap

Java SortedMap 既可以根据键自然排序进行排序也可以根据在创建 map 时提供的 Comparator 来排序。

如果我们在创建 SortedMap 时不提供任何 Comparator (应该用来接收 map 的键的),map 的所有键元素必须实现 Comparable 接口来确保排序。

Java SortedMap Constructors

按照规范,所有通用的 sorted map 都应提供一下标准构造函数:

  1. 无参构造函数: 创建一个根据键的自然排序排序的 sorted map。
  2. 带有一个 Comparator 类型参数的构造函数:创建一个键根据指定 comparator 排序的 sorted map。
  3. 带有一个 Map 类型参数的构造函数:创建一个使用 map 中元素的且根据键的自然排序进行排序的 sorted map。
  4. 带有一个 SortedMap 类型参数的构造函数:它应该像复制构造函数一样工作,并使用相同的元素和提供的 sorted map 的相同顺序创建新的 sorted map 。

当然,这是不可能的,因为接口不能像方法那样指定构造函数。

Java SortedMap implementation

TreeMap 是一个广泛使用的 SortedMap 实现。让我们来使用上面提到的不同的构造器创建它的实例:

  1. package SortedMap;
  2. import java.time.LocalDate;
  3. import java.util.SortedMap;
  4. import java.util.TreeMap;
  5. public class SortedMapTest {
  6. public static void main(String[] args) {
  7. SortedMap<String, PersonalDetails> personMap = new TreeMap<>();
  8. personMap.put("Dan Brown", new PersonalDetails("Writer", LocalDate.of(1964, 6, 22), "New Hampshire"));
  9. personMap.put("Ayn Rand", new PersonalDetails("Writer", LocalDate.of(1905, 2, 2), "Saint Petersburg"));
  10. personMap.put("Devdutt Pattanaik", new PersonalDetails("Mythologist", LocalDate.of(1970, 12, 11), "Mumbai"));
  11. personMap.keySet().forEach(key ->
  12. System.out.println(key + " -> " + personMap.get(key)));
  13. }
  14. }

PersonalDetails 实现:

  1. package SortedMap;
  2. import java.time.LocalDate;
  3. public class PersonalDetails {
  4. String occupation;
  5. LocalDate dataOfBirth;
  6. String city;
  7. public PersonalDetails(String occupation, LocalDate dataOfBirth, String city) {
  8. this.occupation = occupation;
  9. this.dataOfBirth = dataOfBirth;
  10. this.city = city;
  11. }
  12. @Override
  13. public String toString() {
  14. return this.occupation + ", from " + this.city;
  15. }
  16. }

它将按照其按键的自然顺序打印 map。在这种情况下,键类型是 String,它实现了 Comparable 接口。

输出:

  1. Ayn Rand -> Writer, from Saint Petersburg
  2. Dan Brown -> Writer, from New Hampshire
  3. Devdutt Pattanaik -> Mythologist, from Mumbai

如果我们在构造函数参数中提供 Comparator 实现,而不是无参数构造函数,则输出将具有不同的顺序。让我们写一个 lambda 表达式来提供比较器接口的compareTo 实现。假设我们想按照键的长度按照降序对键进行排序:

  1. SortedMap<String, PersonalDetails> personMap = new TreeMap<>((s1, s2) -> s2.length() - s1.length());

输出:

  1. Devdutt Pattanaik -> Mythologist, from Mumbai
  2. Dan Brown -> Writer, from New Hampshire
  3. Ayn Rand -> Writer, from Saint Petersburg

现在我们将通过传递另一个 Map 对象或不同的 sorted map 来创建一个 sorted map。

输出:

  1. Ayn Rand -> Writer, from Saint Petersburg
  2. Dan Brown -> Writer, from New Hampshire
  3. Devdutt Pattanaik -> Mythologist, from Mumbai
  4. Sorted Map constructed using another sorted map:
  5. Ayn Rand -> Writer, from Saint Petersburg
  6. Dan Brown -> Writer, from New Hampshire
  7. Devdutt Pattanaik -> Mythologist, from Mumbai

与 Map 相比,提供了一些额外的方法来使用排序,让我们来看看。

  1. Comparator comparator():返回用于在映射中对键进行排序的比较器实例。如果按照自然顺序对键进行排序,则返回 null 。
  2. Set<Map.Entry> entrySet():返回 map 中包含的映射的 Set 集合。
  3. K firstKey():返回第一个(最低)键。
  4. K lastKey():返回最后一个(最高)键。
  5. Set keySet():返回包含 map 中所有键的 Set 集合。
  6. SortedMap headMap(K toKey):返回键值小于 toKey 的 map 部分的视图。
  7. SortedMap tailMap(K fromKey):返回键值大于或等于 fromKey 的 map 部分的视
  8. Collection values():返回此映射中包含的值的 Collection 集合视图。

注意,上述方法返回的 Set 时实际 Set 的视图。对这些视图所做的更改也反映在实际的数据结构上。

Java SortedMap Implementation

让我们来逐个探索这些方法。我们将通过传递一个比较器来创建一个 sorted map,comparator() 方法将返回比较器。

  1. SortedMap sortedMap = new TreeMap(Comparator.reverseOrder());
  2. Comparator comparator = sortedMap.comparator();

我们来看看 Map 中的映射,它会给我们 Map.Ectry 的 Set 集合。

  1. SortedMap<String, PersonalDetails> sortedMap = new TreeMap<>(Comparator.reverseOrder());
  2. sortedMap.put("Dan Brown", new PersonalDetails("Writer", LocalDate.of(1964, 6, 22), "New Hampshire"));
  3. sortedMap.put("Ayn Rand", new PersonalDetails("Writer", LocalDate.of(1905, 2, 2), "Saint Petersburg"));
  4. sortedMap.put("Devdutt Pattanaik", new PersonalDetails("Mythologist", LocalDate.of(1970, 12, 11), "Mumbai"));
  5. Set<Map.Entry<String, PersonalDetails>> entrySet = sortedMap.entrySet();
  6. entrySet.forEach(entry ->
  7. System.out.println(entry.getKey() + "->" + entry.getValue()));

迭代 entrySet 打印:

  1. Devdutt Pattanaik->Mythologist, from Mumbai
  2. Dan Brown->Writer, from New Hampshire
  3. Ayn Rand->Writer, from Saint Petersburg

keySet() 将返回键的 Set 集合,而 values() 将但会值的 Collection 集合。

  1. sortedMap.keySet().forEach(System.out::println);
  2. Collection<PersonalDetails> values = sortedMap.values();
  3. values.forEach(System.out::println);

此外,还有一些方法可用于获取第一个键,最后一个键,和小于等于或大于等于特定键的 map 部分。

  1. System.out.println("Smallest and largest keys of the map:");
  2. System.out.println(sortedMap.firstKey());
  3. System.out.println(sortedMap.lastKey());
  4. System.out.println("Head map containing keys whose values are less than D.");
  5. SortedMap headMap = sortedMap.headMap("D");
  6. headMap.keySet().forEach(System.out::println);
  7. System.out.println("Tail map containing keys whose values are greater than or equal to D:");
  8. SortedMap tailMap = sortedMap.tailMap("D");
  9. tailMap.keySet().forEach(System.out::println);

发表评论

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

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

相关阅读

    相关 Core Java Tutorial -- Deadlock

    Java 中的死锁是一种编程情况,两个或更多的线程永远被阻塞。至少有两个线程和两个或更多资源出现 Java 死锁情况。在这里我写了一个简单的程序,它会导致 Java 死锁情况,