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

    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)的算法

RISEBY
浏览 2402回答 2
2回答

HUH函数

山不转那水在转。 既然,给出的标准排序 不够数,那就跟 要排序的 数据 对比进行合并,筹够数,那么最终符合我的安排的排序方法。只加多一句代码 这种对比字符串的可能意义不大。但这是简化需求的。实际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]

慕斯709654

参照guava的ExplicitOrdering类做一些改动就行啦。 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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java