Java - Map 使用 Comparator 排序

简介: Java - Map 使用 Comparator 排序

Stream 里的 sorted 方法

Stream<T> sorted(Comparator<? super T> comparator);

Comparator 类

@FunctionalInterface
public interface Comparator<T> {
// 定义自己的Comparator
int compare(T o1, T o2);
...  
// 使用comparing方法定义Comparator
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor){
        Objects.requireNonNull(keyExtractor);
        return (Comparator<T> & Serializable)
            (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
    }
}
// 使用comparingInt(按从小到大的顺序)
public static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) {
        Objects.requireNonNull(keyExtractor);
        return (Comparator<T> & Serializable)
            (c1, c2) -> Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2));
    }

生成测试 map

Map<TopicNLPEnum, List<String>> map = new HashMap<>();
map.put(TopicNLPEnum.SIMILAR, Arrays.asList("小说1", "言情1", "历史1"));
map.put(TopicNLPEnum.RELATIVE, Arrays.asList("小说3", "言情3", "历史3"));
map.put(TopicNLPEnum.ORIGIN, Arrays.asList("小说", "言情", "历史"));
map.put(TopicNLPEnum.TAGS, Arrays.asList("小说2", "言情2", "历史2"));

使用 comparing 的方式 new 一个 Comparator


map.entrySet().stream()
       .sorted(Comparator.comparing(entry -> entry.getKey().getScore()))
       .forEach(entry -> System.out.println(entry.getValue())); 

使用 comparingInt

map.entrySet().stream()
       .sorted(Comparator.comparingInt(entry -> entry.getKey().getScore()))
       .forEach(entry -> System.out.println(entry.getValue()));

自定义 Comparator

Comparator<Map.Entry<TopicNLPEnum, List<String>>> comp = (o1, o2) -> o1.getKey().getScore() - o2.getKey().getScore();
map.entrySet().stream()
       .sorted(comp)
       .forEach(entry -> System.out.println(entry.getValue()));

打印结果

[小说3, 言情3, 历史3]
[小说2, 言情2, 历史2]
[小说1, 言情1, 历史1]
[小说, 言情, 历史]
目录
相关文章
|
1月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
1天前
|
存储 安全 Java
[Java基础面试题] Map 接口相关
[Java基础面试题] Map 接口相关
|
13天前
|
存储 算法 安全
Java Map:键值对的奇妙之旅
Java Map:键值对的奇妙之旅
41 0
Java Map:键值对的奇妙之旅
|
1月前
|
Java
【Java】通过Comparator比较器的方式给对象数组排序
【Java】通过Comparator比较器的方式给对象数组排序
11 0
|
1月前
|
Java
如何使用 Java 8 进行字符串排序?
【2月更文挑战第21天】
73 3
|
1月前
|
存储 安全 Java
【Java】集合(三)Map
【Java】集合(三)Map
20 0
|
2月前
|
Java
Java排序
【2月更文挑战第7天】【2月更文挑战第17篇】List对象集合自定义排序,列出了以前的用法以及新用法。
27 0
|
2月前
|
存储 Java
Java TreeMap:基于红黑树的排序映射解析
Java TreeMap:基于红黑树的排序映射解析
|
2月前
|
存储 安全 Java
Java Map接口及其常用实现类详解
Java Map接口及其常用实现类详解
|
2月前
|
安全 Java
Java TreeSet:基于红黑树的排序集合解析
Java TreeSet:基于红黑树的排序集合解析