有如下实体类A,包含属性name,year,type。现在想要让list输出的对象A先按照type属性的“集群,国家级产业园,省级产业园,国家级强镇,省级强镇,田园”的顺序进行排序,再在已排好序的基础上按照year属性的以时间从远到近的顺序进行排序。
import java.util.Date;
public class A {
String name;
Date year;
String type;
public Date getYear() {
return year;
}
public void setYear(Date year) {
this.year = year;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public A(String name, Date year,String type) {
this.name = name;
this.year = year;
this.type = type;
}
public A() {
}
@Override
public String toString() {
return "A{" +
"name='" + name + '\'' +
", year='" + year + '\'' +
", type='" + type + '\'' +
'}'+'\n';
}
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Test01 {
public static void main(String[] args) throws ParseException {
//新建17个A对象
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
Date date = dateformat.parse("2016-6-19");
A a0 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a1 = new A("59", dateformat.parse("2017-01-01"),"集群");
A a2 = new A("95", dateformat.parse("2016-01-01"),"国家级产业园");
A a3 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a4 = new A("25", dateformat.parse("2017-6-19"),"省级产业园");
A a5 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a6 = new A("3", dateformat.parse("2017-6-19"),"国家级强镇");
A a7 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a8 = new A("16", dateformat.parse("2017-6-19"),"省级强镇");
A a9 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a10 = new A("18", dateformat.parse("2018-6-19"),"田园");
A a11 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a12 = new A("36", dateformat.parse("2018-6-19"),"田园");
A a13 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a14 = new A("20", dateformat.parse("2019-6-19"),"田园");
A a15 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a16 = new A("55", dateformat.parse("2019-6-19"),"省级强镇");
//将对象放入aList集合中
List aList = new ArrayList<>();
aList.add(a0);aList.add(a1);aList.add(a2);
aList.add(a3);aList.add(a4);aList.add(a5);
aList.add(a6);aList.add(a7);aList.add(a8);
aList.add(a9);aList.add(a10);aList.add(a11);
aList.add(a12);aList.add(a13);aList.add(a14);
aList.add(a15);aList.add(a16);
aList.add(a8);
System.out.println(aList);
System.out.println("**************************************");
/**
* 排序顺序
* 集群,国家级产业园,省级产业园,国家级强镇,省级强镇,田园
*
* */
Comparator byyear = Comparator.comparing(A::getYear);//按照year属性升序
Comparator bytype = Comparator.comparing(A::getType);//按照type属性升序
Collections.sort(aList, bytype.thenComparing(byyear));//将aList按照a字段先升序再按照B字段进行升序排列
System.out.println(aList);
}
}
按照上述代码运行的结果如下:
可以发现这样直接使用Comparator.comparing的确先按照type进行排序,再按照year进行排序,但是排序的结果与我们的期望不符,它并没有按照“集群,国家级产业园,省级产业园,国家级强镇,省级强镇,田园”这样的顺序进行排序。
进一步修改代码如下:
为实体类对象A添加一个typeid属性,并设置set方法
package Problem;
/**
* @author SnakeWoodMan
* @create 2022-04-18 21:48
*/
import java.util.Date;
public class A {
String name;
Date year;
String type;
int typeid;
// 集群,国家级产业园,省级产业园,国家级强镇,省级强镇,田园
public void setTypeid(){
if (this.type.equals("集群")) {
this.typeid = 1;
}else if (this.type.equals("国家级产业园")){
this.typeid = 2;
}else if (this.type.equals("省级产业园")){
this.typeid = 3;
}else if (this.type.equals("国家级强镇")){
this.typeid = 4;
}else if (this.type.equals("省级强镇")){
this.typeid = 5;
}else if (this.type.equals("田园")){
this.typeid = 6;
}
}
public int getTypeid(){
return typeid;
}
public Date getYear() {
return year;
}
public void setYear(Date year) {
this.year = year;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public A(String name, Date year,String type) {
this.name = name;
this.year = year;
this.type = type;
}
public A() {
}
@Override
public String toString() {
return "A{" +
"name='" + name + '\'' +
", year='" + year + '\'' +
", type='" + type + '\'' +
'}'+'\n';
}
}
排序代码如下:
package Problem;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @author SnakeWoodMan
* @create 2022-04-18 21:50
*/
public class Test01 {
public static void main(String[] args) throws ParseException {
//新建9个A对象
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
Date date = dateformat.parse("2016-6-19");
A a0 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a1 = new A("59", dateformat.parse("2017-01-01"),"集群");
A a2 = new A("95", dateformat.parse("2016-01-01"),"国家级产业园");
A a3 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a4 = new A("25", dateformat.parse("2017-6-19"),"省级产业园");
A a5 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a6 = new A("3", dateformat.parse("2017-6-19"),"国家级强镇");
A a7 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a8 = new A("16", dateformat.parse("2017-6-19"),"省级强镇");
A a9 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a10 = new A("18", dateformat.parse("2018-6-19"),"田园");
A a11 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a12 = new A("36", dateformat.parse("2018-6-19"),"田园");
A a13 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a14 = new A("20", dateformat.parse("2019-6-19"),"田园");
A a15 = new A("1", dateformat.parse("2016-01-01"),"集群");
A a16 = new A("55", dateformat.parse("2019-6-19"),"省级强镇");
//将对象放入aList集合中
List<A> aList = new ArrayList<>();
aList.add(a0);aList.add(a1);aList.add(a2);
aList.add(a3);aList.add(a4);aList.add(a5);
aList.add(a6);aList.add(a7);aList.add(a8);
aList.add(a9);aList.add(a10);aList.add(a11);
aList.add(a12);aList.add(a13);aList.add(a14);
aList.add(a15);aList.add(a16);
aList.add(a8);
System.out.println(aList);
System.out.println("**************************************");
/**
* 排序顺序
* 集群,国家级产业园,省级产业园,国家级强镇,省级强镇,田园
*
* */
for (A a : aList){
a.setTypeid();
}
Comparator bytypeid = Comparator.comparing(A::getTypeid);//按照Typeid升序
Comparator byyear = Comparator.comparing(A::getYear);//按照Year升序
Comparator bytype = Comparator.comparing(A::getType);//按照Type升序
Collections.sort(aList, bytypeid.thenComparing(byyear));//将aList按照Typeid字段先升序再按照Year字段进行升序排列
System.out.println(aList);
}
}
最后的排序结果如下:
参考资料
- https://blog.csdn.net/weixin_42510792/article/details/114566578
- https://www.cnblogs.com/kuanglongblogs/p/11230250.html
- https://my.oschina.net/xinxingegeya/blog/2046405