美文网首页
java8 map 使用Comparator排序

java8 map 使用Comparator排序

作者: aix91 | 来源:发表于2019-01-07 17:12 被阅读0次

    1. java8 stream里排序相关方法

    • 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));
        }
    

    2. 实例

    • 生成测试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]
    [小说, 言情, 历史]
    

    相关文章

      网友评论

          本文标题:java8 map 使用Comparator排序

          本文链接:https://www.haomeiwen.com/subject/mrikrqtx.html