java 对象集合排序_Java对象集合万能排序封装

前言

直接进入正题,闲的没事把Java对对象集合排序进行了封装,写起来优雅一点,不用每次用的时候自己再new一个比较器对象了。

ListOrderUtil

没多少东西,就是下边这点代码!

import java.lang.reflect.Field;

import java.util.*;

public class ListOrderUtil {

private List mArrayList;//数据集合

private LinkedHashMap mOrderList = new LinkedHashMap<>();//所有的排序字段

private Class mClass;//当天T的Class

public static int ORDER_ASC = 1;//正序排列

public static int ORDER_DESC = 2;//倒序排列

public ListOrderUtil(List arrayList, Class tClass) {

this.mArrayList = arrayList;

this.mClass = tClass;

}

/**

* 设置排序字段(按照设置的先后顺序对其进行排序)

*

* @param fieldName 字段名称

* @param orderPattern 排序模式

* @return

*/

public ListOrderUtil setOrderField(String fieldName, int orderPattern) {

this.mOrderList.put(fieldName, orderPattern);

return this;

}

/**

* 对数据集合进行排序

*

* @return

*/

public List order() {

this.mArrayList.sort(new Comparator() {

@Override

public int compare(T o1, T o2) {

Field field = null;

int order = 0;

for (Map.Entry item : mOrderList.entrySet()) {

try {

field = mClass.getDeclaredField(item.getKey());

field.setAccessible(true);

if (field == null) {

throw new NoSuchFieldException(item.getKey());

}

if (item.getValue() == ORDER_ASC) {

order = field.get(o1).toString().compareTo(field.get(o2).toString());

} else {

order = field.get(o2).toString().compareTo(field.get(o1).toString());

}

if (order != 0) {

return order;

}

} catch (Exception e) {

e.printStackTrace();

}

}

return 0;

}

});

return this.mArrayList;

}

}

使用案例

首先是对象一枚!

import java.util.Comparator;

public class Students {

private int studentId;

private int age;

private String studentName;

public Students() {

}

public Students(int studentId, int age, String studentName) {

this.studentId = studentId;

this.age = age;

this.studentName = studentName;

}

public int getStudentId() {

return studentId;

}

public void setStudentId(int studentId) {

this.studentId = studentId;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getStudentName() {

return studentName;

}

public void setStudentName(String studentName) {

this.studentName = studentName;

}

}

先来看看不封装的时候如何排序:

大量的逻辑处理代码冗余......

public class Main {

public static void main(String[] args) {

//添加测试数据

ArrayList students = new ArrayList<>();

Students students1 = new Students(1001, 22, "djk");

Students students2 = new Students(1002, 18, "xxh");

Students students3 = new Students(1003, 31, "wyd");

Students students4 = new Students(1002, 18, "wxz");

Students students5 = new Students(1005, 19, "sxn");

Students students6 = new Students(1004, 32, "ljc");

students.add(students1);

students.add(students2);

students.add(students3);

students.add(students4);

students.add(students5);

students.add(students6);

//-------------不封装的写法----------------------------不堪入目啊!!!!

//1、使用studentId正序排列

Collections.sort(students, new Comparator() {

@Override

public int compare(Students o1, Students o2) {

return o1.getStudentId() - o2.getStudentId();

}

});

//2、使用studentId和age进行多字段排序,studentId正序为首,若想等便以age进行倒序排列。

Collections.sort(students, new Comparator() {

@Override

public int compare(Students o1, Students o2) {

int order = o1.getStudentId() - o2.getStudentId();

if (order == 0) {

order = o2.getAge() - o1.getAge();

}

return order;

}

});

//3、多字段排序

Collections.sort(students, new Comparator() {

@Override

public int compare(Students o1, Students o2) {

int order = o1.getStudentId() - o2.getStudentId();

if (order == 0) {

order = o2.getAge() - o1.getAge();

}

if (order == 0) {

order = o2.getStudentName().compareTo(o1.getStudentName());

}

return order;

}

});

}

}

再来看看封装后的:

舒服多了......

public class Main {

public static void main(String[] args) {

//添加测试数据

ArrayList students = new ArrayList<>();

Students students1 = new Students(1001, 22, "djk");

Students students2 = new Students(1002, 18, "xxh");

Students students3 = new Students(1003, 31, "wyd");

Students students4 = new Students(1002, 18, "wxz");

Students students5 = new Students(1005, 19, "sxn");

Students students6 = new Students(1004, 32, "ljc");

students.add(students1);

students.add(students2);

students.add(students3);

students.add(students4);

students.add(students5);

students.add(students6);

//排序使用

ListOrderUtil listOrderUtil = new ListOrderUtil<>(students, Students.class);

//1、使用studentId正序排列

listOrderUtil.setOrderField("studentId", ListOrderUtil.ORDER_ASC).order();

//2、使用studentId和age进行多字段排序,studentId正序为首,若想等便以age进行倒序排列。

listOrderUtil.setOrderField("studentId", ListOrderUtil.ORDER_ASC)

.setOrderField("age", ListOrderUtil.ORDER_DESC);

//3、多字段排序

listOrderUtil.setOrderField("studentId", ListOrderUtil.ORDER_ASC)

.setOrderField("age", ListOrderUtil.ORDER_DESC)

.setOrderField("studentName", ListOrderUtil.ORDER_DESC)

.order();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值