欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Core Java Tutorial -,corejavatutorial

来源: javaer 分享于  点击 44576 次 点评:262

Core Java Tutorial -,corejavatutorial


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

Java SortedMap

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

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

Java SortedMap Constructors

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

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

Java SortedMap implementation

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

package SortedMap;

import java.time.LocalDate;
import java.util.SortedMap;
import java.util.TreeMap;

public class SortedMapTest {
    public static void main(String[] args) {

        SortedMap<String, PersonalDetails> personMap = new TreeMap<>();
        personMap.put("Dan Brown", new PersonalDetails("Writer", LocalDate.of(1964, 6, 22), "New Hampshire"));
        personMap.put("Ayn Rand", new PersonalDetails("Writer", LocalDate.of(1905, 2, 2), "Saint Petersburg"));
        personMap.put("Devdutt Pattanaik", new PersonalDetails("Mythologist", LocalDate.of(1970, 12, 11), "Mumbai"));

        personMap.keySet().forEach(key ->
                System.out.println(key + " -> " + personMap.get(key)));
    }
}

PersonalDetails 实现:

package SortedMap;

import java.time.LocalDate;

public class PersonalDetails {
    String occupation;
    LocalDate dataOfBirth;
    String city;

    public PersonalDetails(String occupation, LocalDate dataOfBirth, String city) {
        this.occupation = occupation;
        this.dataOfBirth = dataOfBirth;
        this.city = city;
    }

    @Override
    public String toString() {
        return this.occupation + ", from " + this.city;
    }
}

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

输出:

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

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

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

输出:

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

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

输出:

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

Sorted Map constructed using another sorted map:
Ayn Rand -> Writer, from Saint Petersburg
Dan Brown -> Writer, from New Hampshire
Devdutt Pattanaik -> Mythologist, from Mumbai

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

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

Java SortedMap Implementation

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

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

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

 SortedMap<String, PersonalDetails> sortedMap = new TreeMap<>(Comparator.reverseOrder());

        sortedMap.put("Dan Brown", new PersonalDetails("Writer", LocalDate.of(1964, 6, 22), "New Hampshire"));
        sortedMap.put("Ayn Rand", new PersonalDetails("Writer", LocalDate.of(1905, 2, 2), "Saint Petersburg"));
        sortedMap.put("Devdutt Pattanaik", new PersonalDetails("Mythologist", LocalDate.of(1970, 12, 11), "Mumbai"));

        Set<Map.Entry<String, PersonalDetails>> entrySet = sortedMap.entrySet();

        entrySet.forEach(entry ->
                System.out.println(entry.getKey() + "->" + entry.getValue()));

迭代 entrySet 打印:

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

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

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

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

System.out.println("Smallest and largest keys of the map:");
System.out.println(sortedMap.firstKey());
System.out.println(sortedMap.lastKey());

System.out.println("Head map containing keys whose values are less than D.");
SortedMap headMap = sortedMap.headMap("D");
headMap.keySet().forEach(System.out::println);

System.out.println("Tail map containing keys whose values are greater than or equal to D:");
SortedMap tailMap = sortedMap.tailMap("D");
tailMap.keySet().forEach(System.out::println);

相关文章

    暂无相关文章
相关栏目:

用户点评