为了账号安全,请及时绑定邮箱和手机立即绑定

java集合指定元素排序:最前,按照提供的顺序排序?求算法

java集合指定元素排序:最前,按照提供的顺序排序?求算法

RISEBY 2019-01-17 03:03:46
List<String> orderings= Stream.of("温度", "运行时间").collect(Collectors.toList()); List<String> target= Stream.of("温度1", "运行时间ss","运行时间", "温度").collect(Collectors.toList()); 如上数据源:要排序target。要求最终效果: List<String> target= Stream.of("温度", "运行时间", "温度1","运行时间ss").collect(Collectors.toList()); 缺陷方法: Ordering ordering = Ordering.explicit(orderings); List<String> strings = target.stream().sorted(new Comparator<String>() { @Override public int compare (String o1, String o2) { if (target.contains(o1) && target.contains(o2)) { return ordering.compare(o1, o2); } else { return 0; } } }).collect(Collectors.toList()); 但是这样,只会排序 含有orderings元素的 数据。求合理灵活便捷优雅(是优雅的,是优雅的,是优雅的,别for循环ifelse)的算法
查看完整描述

2 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

山不转那水在转。

既然,给出的标准排序 不够数,那就跟 要排序的 数据 对比进行合并,筹够数,那么最终符合我的安排的排序方法。只加多一句代码

这种对比字符串的可能意义不大。但这是简化需求的。实际target是对象,Map就有这个必要了

  List<String> orderings= Stream.of("温度", "运行时间").collect(Collectors.toList());
        List<String> target= Stream.of("温度1", "运行时间ss","运行时间", "温度").collect(Collectors.toList());
        // 补充数据
        List<String> newOrdering = Stream.concat(orderings.stream(), target.stream().filter(item -> !orderings.contains(item))).collect(Collectors.toList());


        Ordering ordering = Ordering.explicit(newOrdering);

        List<String> strings = target.stream().sorted(new Comparator<String>() {
            @Override
            public int compare (String o1, String o2) {
                if (newOrdering.contains(o1) && newOrdering.contains(o2)) {
                    return ordering.compare(o1, o2);
                } else {
                    return 0;
                }
            }
        }).collect(Collectors.toList());

        System.out.println(strings);

最终结果:
[温度, 运行时间, 温度1, 运行时间ss]

查看完整回答
反对 回复 2019-02-12
?
慕斯709654

TA贡献1840条经验 获得超5个赞

参照guavaExplicitOrdering类做一些改动就行啦。

        List<String> orderings= Stream.of("温度", "运行时间").collect(Collectors.toList());
        List<String> target= Stream.of( "运行时间ss","运行时间","3","温度1", "温度").collect(Collectors.toList());

        class ExplicitOrdering<T> implements Comparator<T> {

            private Map<T,Integer> indexMap = new HashMap();

            public ExplicitOrdering(List<T> explicit) {
                for (int i = 0; i < explicit.size(); i++) {
                    indexMap.put(explicit.get(i),i);
                }
            }

            @Override
            public int compare(T o1, T o2) {
                return rank(o1) - rank(o2);
            }

            private int rank(T value) {
                Integer rank = indexMap.get(value);
                if (rank == null) {
                    return Integer.MIN_VALUE;
                }
                return rank;
            }
        }

        List<String> strings = target.stream().sorted(new ExplicitOrdering<>(orderings).thenComparing(Comparator.naturalOrder())).collect(Collectors.toList());

        System.out.println(strings);
查看完整回答
反对 回复 2019-02-12
  • 2 回答
  • 0 关注
  • 2401 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信