List工具類
對任意List集合排序
工具類
import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections.ComparatorUtils;
import org.apache.commons.collections.comparators.ComparableComparator;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* @author ShanCong
* @date 2018/10/23 20:26
* @description:
*/
public class ListSortUtil {
/**
* @param targetList * 要排序的實體類List集合
* @param sortField * 排序字段(實體類屬性名)
* @param sortMode * true正序,false逆序
*/
@SuppressWarnings("all")
public static <T> void sort(List<T> targetList, final String sortField, final boolean sortMode) {
if (targetList == null || targetList.size() < 2 || sortField == null || sortField.length() == 0) {
return;
}
Collections.sort(targetList, new Comparator() {
@Override
public int compare(Object obj1, Object obj2) {
int retVal = 0;
try { // 獲取getXxx()方法名稱
String methodStr = "get" + sortField.substring(0, 1).toUpperCase() + sortField.substring(1);
//方法不存在會報NoSuchMethodException
Method method1 = ((T) obj1).getClass().getMethod(methodStr, null);
//System.out.println("method1 : "+method1);
Method method2 = ((T) obj2).getClass().getMethod(methodStr, null);
// System.out.println("method2 : "+method2);
if (sortMode) {
retVal = method1.invoke(((T) obj1), null).toString().compareTo(method2.invoke(((T) obj2), null).toString());
} else {
retVal = method2.invoke(((T) obj2), null).toString().compareTo(method1.invoke(((T) obj1), null).toString());
}
} catch (Exception e) {
System.out.println("List<" + ((T) obj1).getClass().getName() + ">排序異常!");
e.printStackTrace();
}
return retVal;
}
});
}
/**
* @describe 依據某個字段對集合進行排序
* @author sc
* @date 2013-1-22 下午3:44:47
* @param list
* 待排序的集合
* @param fieldName
* 依據這個字段進行排序
* @param asc
* 如果爲true,是正序;爲false,爲倒序
*/
@SuppressWarnings("unchecked")
public static <T> void sortList(List<T> list, String fieldName, boolean asc) {
Comparator<?> mycmp = ComparableComparator.getInstance();
// 允許null
mycmp = ComparatorUtils.nullLowComparator(mycmp);
if (!asc) {
// 逆序
mycmp = ComparatorUtils.reversedComparator(mycmp);
}
Collections.sort(list, new BeanComparator(fieldName, mycmp));
}
}
實體
import java.util.Date;
/**
* @author ShanCong
* @date 2018/10/23 21:02
* @description:
*/
public class Dog {
private String name;
private Date time;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", time=" + time +
'}';
}
}
測試
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author ShanCong
* @date 2018/10/23 21:05
* @description:
*/
public class ListSortMain {
public static void main(String[] args) throws InterruptedException {
List<Dog> dogList = new ArrayList<Dog>();
/* for (int i = 0; i < 5; i++) {
Dog d = new Dog();
d.setName("dog" + i);
d.setTime(new Date());
dogList.add(d);
Thread.sleep(1000);
}*/
for (int i = 0; i < 5; i++) {
if(i==0){
Dog d = new Dog();
d.setName("app_04_01");
d.setTime(new Date());
dogList.add(d);
Thread.sleep(1000);
}
if(i==1){
Dog d = new Dog();
d.setName("app_03");
d.setTime(new Date());
dogList.add(d);
Thread.sleep(1000);
}
if(i==2){
Dog d = new Dog();
d.setName("app_04");
d.setTime(new Date());
dogList.add(d);
Thread.sleep(1000);
}
if(i==3){
Dog d = new Dog();
d.setName("app_02");
d.setTime(new Date());
dogList.add(d);
Thread.sleep(1000);
}
if(i==4){
Dog d = new Dog();
d.setName("app_04_02");
d.setTime(new Date());
dogList.add(d);
Thread.sleep(1000);
}
if(i==5){
Dog d = new Dog();
d.setName("app_03_01");
d.setTime(new Date());
dogList.add(d);
Thread.sleep(1000);
}
}
ArrayList<Integer> list = new ArrayList<Integer>();
System.out.println("排序前:" );
for(Dog d : dogList){
System.out.println(d.getName());
}
// ListSortUtil.sort(dogList, "name", true);
ListSortUtil.sortList(dogList, "name", true);
System.out.println("按name正序排:");
for(Dog d : dogList){
System.out.println(d.getName());
}
/* ListSortUtil.sort(dogList, "name", false);
System.out.println("按name逆序排:" + dogList.toString());
ListSortUtil.sort(dogList, "time", true);
System.out.println("按time正序排:" + dogList.toString());
ListSortUtil.sort(dogList, "time", false);
System.out.println("按time逆序排:" + dogList.toString());*/
}
}