哈哈哈,不好意思,问了题主那么久...根据我获得需求描述,最后我还是觉得引用新的编程元素来使业务稍微变简单的,我整理到需求应该是:
首先给定一个指定关键字的排序,给出一个字符串列表,对列表进行排序,若字符串列表中包含了关键字,则该这种字符串优先级高,排前面,并且还要根据该字符串所包含的关键字顺序排序,其他没有包含关键字的字符串则靠后,顺序不用关心
所以我引用了新的编程元素,因为给出的orderings是有顺序的,所以只有一个字符串是不能体现这个顺序的,我新增加了一个元素OrderParam
@Getter
@Builder
public class OrderParam{
private String param;
// 值越小,优先级越高
private int order;
}
所以之前的
List orderings= Stream.of("温度", "运行时间").collect(Collectors.toList());
就变为
List orderings= OrderParams.createOrderings("温度", "运行时间");
这里写了一个工具类OrderParams
public class OrderParams{
/**
* 根据字符串数组生成OrderParam集合
* @param params
* @return
*/
public static List createOrderings(String ... params){
return IntStream.range(0, params.length)
.mapToObj(i -> OrderParam.builder().param(params[i]).order(i).build())
.collect(Collectors.toList());
}
}
然后最后的测试类写出来就是这个样子
public class Test {
/**
* 这里思路很简单,orderings是有顺序,给出的target先按照orderings的顺序设定它的优先级,然后直接根据优先级排序就可以了
* @param args
*/
public static void main(String[] args) {
List orderings= OrderParams.createOrderings("温度", "运行时间");
List target= Stream.of("sa", "温度1", "ttttt", "运行时间", "温度", "运行时间ss")
.collect(Collectors.toList());
List result = target.stream()
.map(t -> toOrderParam(orderings, t))
// 这里已经转化成了OrderParam了,所以直接根据OrderParam的order排序即可
.sorted(Comparator.comparing(OrderParam::getOrder))
.map(OrderParam::getParam)
.collect(Collectors.toList());
System.out.println(result);
}
private static OrderParam toOrderParam(List orderings, String t) {
return orderings.stream()
.filter(orderParam -> t.contains(orderParam.getParam()))
.findFirst()
.map(orderParam -> OrderParam.builder().param(t).order(orderParam.getOrder()).build())
// 没有包含在orderings里的,就给一个最低优先级即可
.orElse(OrderParam.builder().param(t).order(Integer.MAX_VALUE).build());
}
}
最后执行结果:
以上就是我的想法。。。问的有点多。。打扰了。。哈哈哈哈