java 一个list根据另一个list进行排序_一个List按照另一个List的数据顺序来排序_可乐要喝国产的博客-CSDN博客

平时我们一般都是直接按照一定的规则,在sql查询返回结果的时候,就返回特定排列顺序的List结果。例如order by createtime desc; 这样的排序结果一般都是数据库中已有的字段的,比较好排序。 但是,有时候会有要求,一个list orderRegulation设置顺序,另一个list targetList按照规则排列自身的顺序。这样就很难在mysql中直接写出排序规则,直接输出,需要我们在代码中进行实现。  下面是我参考一些资料,做了部分排序算法的优化来输出我们想要的结果。 该排序适用于数据内容一致(类型一致),顺序不相同的情况。 targetList中多出来的数据,排在新的List数组的最后。

示例代码如下:

package demo.springboot.web;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.List;

/**

* @author cx.hao

* @date 2019/6/26 15:29

*/

public class ListOrder {undefined

public static void main(String[] args) {undefined

ListorderRegulation = Arrays.asList("G102", "G103", "G108", "29", "28", "25", "24", "G109", "G105", "26", "21");

ListtargetList = new ArrayList();

Posts post3 = new Posts();

post3.setId("G102");

post3.setName("xiaoli3");

post3.setAge("23");

Posts post2 = new Posts();

post2.setId("G103");

post2.setName("xiaoli2");

post2.setAge("22");

Posts post4 = new Posts();

post4.setId("G109");

post4.setName("xiaoli4");

post4.setAge("25");

Posts post7 = new Posts();

post7.setId("G107");

post7.setName("xiaoli7");

post7.setAge("21");

Posts post8 = new Posts();

post8.setId("G101");

post8.setName("xiaoli8");

post8.setAge("26");

Posts post5 = new Posts();

post5.setId("G105");

post5.setName("xiaoli5");

post5.setAge("27");

Posts post1 = new Posts();

post1.setId("G104");

post1.setName("xiaoli1");

post1.setAge("29");

Posts post6 = new Posts();

post6.setId("G106");

post6.setName("xiaoli6");

post6.setAge("23");

Posts post9 = new Posts();

post9.setId("G106");

post9.setName("xiaoli9");

post9.setAge("25");

Posts post10 = new Posts();

post10.setId("G104");

post10.setName("xiaoli10");

post10.setAge("28");

targetList.add(post1);

targetList.add(post2);

targetList.add(post3);

targetList.add(post4);

targetList.add(post5);

targetList.add(post6);

targetList.add(post7);

targetList.add(post8);

targetList.add(post9);

targetList.add(post10);

System.out.println("排列前的数据:");

targetList.forEach(t -> System.out.print(t.getId() + t.getName() + "~" + t.getAge() + " "));

System.out.println();

setListOrder(orderRegulation, targetList);

System.out.println("排序的规则:");

orderRegulation.forEach(t -> System.out.print(t + " "));

System.out.println();

System.out.println("排列后的数据:");

targetList.forEach(t -> System.out.print(t.getId() + t.getName() + "~" + t.getAge() + " "));

}

//平时排序可使用其中一种,下面是综合两个条件排序

public static void setListOrder(ListorderRegulation, ListtargetList) {undefined

//按照Posts的Id来排序

Collections.sort(targetList, ((o1, o2) -> {undefined

int io1 = orderRegulation.indexOf(o1.getId());

int io2 = orderRegulation.indexOf(o2.getId());

if (io1 != -1) {undefined

io1 = targetList.size() - io1;

}

if (io2 != -1) {undefined

io2 = targetList.size() - io2;

}

return io2 - io1;

}));

//按照Posts的age来排序

Collections.sort(targetList, ((o1, o2) -> {undefined

int io1 = orderRegulation.indexOf(o1.getAge());

int io2 = orderRegulation.indexOf(o2.getAge());

if (io1 != -1) {undefined

io1 = targetList.size() - io1;

}

if (io2 != -1) {undefined

io2 = targetList.size() - io2;

}

return io2 - io1;

}));

}

}

其中的Posts类包含内容很明显

package demo.springboot.web;

/**

* @author cx.hao

* @date 2019/6/6 11:46

*/

public class Posts {undefined

private String id;

private String name;

private String age;

public String getId() {undefined

return id;

}

public void setId(String id) {undefined

this.id = id;

}

public String getName() {undefined

return name;

}

public void setName(String name) {undefined

this.name = name;

}

public String getAge() {undefined

return age;

}

public void setAge(String age) {undefined

this.age = age;

}

}

运行以后输出结果如下:

8586bb8861504e8aabaa4eacf487c9b3.jpg

是不是满足了上述的排序要求呢?

在这里,我们做了两次排序。 第一次是按照Posts的id进行排序,targetList 会根据 orderRegulation的顺序不同有个排序结果;第二次,又会在上述的排序结果的基础上,根据Posts的age进行新一轮的排序。 因此最后结果如上,首先根据第二轮的排序规则,再按照第一轮的规则,两种参考规则都不包含的数据在最后展示。

当然,如果你们的排序要求没有这么复杂,可以参考下面的示例来进行排序,注意:下面的排序结果未设置顺序的部分展示在最前面。

package demo.springboot.web;

import java.util.*;

/**

* @author cx.hao

* @date 2019/6/26 15:55

*/

public class SetSort {undefined

/**

* 设置顺序

*

* @Des 一个list orderRegulation设置顺序,另一个list targetList按照规则排列自身的顺序,

如果targetList的数据比 orderRegulation的数据多,多出来的那部分数据,按照原来的顺序,且排在开头

结果即 7 9 6 8(未设置顺序的部分) + 0 1 2 3 4 5(排序部分)

@适用点: 1. 数据内容一致,只是顺序不同

2. orderRegulation的数据内容 包含 targetList的内容

* @param orderRegulation

* @param targetList

*/

public static void setListOrder(ListorderRegulation, ListtargetList){undefined

Collections.sort(targetList,((o1, o2) -> {undefined

int io1 = orderRegulation.indexOf(o1);

int io2 = orderRegulation.indexOf(o2);

return io1 - io2;

}));

System.out.println("规则数据:");

orderRegulation.forEach(t-> System.out.print(t+" " ));

System.out.println();

System.out.println("排列后的数据:");

targetList.forEach(t-> System.out.print(t+" " ));

}

public static void sortUp(Listlist){undefined

if (null != list && !list.isEmpty()){undefined

Collections.sort(list, Comparator.comparingInt(x -> x));

System.out.println("\n sortUp 小-大");

list.forEach(t-> System.out.print(t+" " ));

}

}

public static void sortDown(Listlist){undefined

if (null != list && !list.isEmpty()){undefined

Collections.sort(list, (x, y)-> y - x );

System.out.println("\n sortDown 大-小");

list.forEach(t-> System.out.print(t+" " ));

}

}

public static void main(String[] args) {undefined

ListorderRegulation = Arrays.asList(0,1,2,3,4,5);

ListtargetList = Arrays.asList(1,3,5,7,9,2,4,6,8,0);

SetSort.setListOrder(orderRegulation,targetList);

sortUp(targetList);

sortDown(targetList);

}

}

最后的运行结果截图如下:

0324a56379064cd1977d8aca4d8a98ee.jpg


原网址: 访问
创建于: 2022-01-07 14:18:13
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论