list 置顶元素_java集合指定元素排序:最前,按照提供的顺序排序?求算法
哈哈哈,不好意思,問了題主那么久...根據我獲得需求描述,最后我還是覺得引用新的編程元素來使業務稍微變簡單的,我整理到需求應該是:
首先給定一個指定關鍵字的排序,給出一個字符串列表,對列表進行排序,若字符串列表中包含了關鍵字,則該這種字符串優先級高,排前面,并且還要根據該字符串所包含的關鍵字順序排序,其他沒有包含關鍵字的字符串則靠后,順序不用關心
所以我引用了新的編程元素,因為給出的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());
}
}
最后執行結果:
以上就是我的想法。。。問的有點多。。打擾了。。哈哈哈哈
總結
以上是生活随笔為你收集整理的list 置顶元素_java集合指定元素排序:最前,按照提供的顺序排序?求算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自由之战安卓版(安卓自由之战)
- 下一篇: 数据结构树的基本操作_树的各类基本操作(