第一種:比較標準的jdk的執行比較類的Comparator接口
今天項目中用到了對list中的對象排序,把代碼和大家分享下,用工具類collections中的sort方法排序。寫一個比較類實現Comparator接口,具體兩個類的大小就取決於實現這個接口時裏邊的邏輯。接下來大家看下例子
以下是比較類的實現
package org.sort;
import java.util.Comparator;
public class ComparatorPerson implements Comparator{
public int compare(Object arg0, Object arg1) {
Person p0=(Person)arg0;
Person p1=(Person)arg1;
if(p0.getAge()<p1.getAge()){
return 1;
}else if(p0.getAge()==p1.getAge()){
if(p0.getName().compareTo(p1.getName())>0){
return 1;
}else{
return 0;
}
}else{
return 0;
}
}
}
以下是需要比較的類
package org.sort;
public class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
}
以下是測試類
package org.sort;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Person> list = new ArrayList<Person>();
list.add(new Person(10, "張三"));
list.add(new Person(10, "張三丰"));
list.add(new Person(11, "張三"));
list.add(new Person(11, "張三丰"));
for (Person p : list) {
System.out.println(p.getAge() + "--排序前---" + p.getName());
}
Collections.sort(list, new ComparatorPerson());
for (Person p : list) {
System.out.println(p.getAge() + "---排序後--" + p.getName());
}
String[] ss = "a||b ".split("\\|\\|");
System.out.println(ss.length);
for (String string : ss) {
System.out.println(string);
}
}
}
第二種:JAVA中 List集合如何按某個字段升序或降序排序
public class SortUtil {
private final static String SORT_ASC = "ASC";
private final static String SORT_DESC = "DESC";
/**
* 集合排序
* @param list 需排序的集合
* @param property 元素名稱
* @param sort 排序方式
* @param <T>
* @return
*/
public static <T> void sortList(List<T> list, String property, String sort) {
Collections.sort(list, new Comparator<T>() {
@Override
public int compare(T o1, T o2) {
try {
Field field1 = o1.getClass().getDeclaredField(property);
field1.setAccessible(true);
Integer i1 = Integer.parseInt(getNumber(field1.get(o1).toString()));
Field field2 = o2.getClass().getDeclaredField(property);
field2.setAccessible(true);
Integer i2 = Integer.parseInt(getNumber(field2.get(o2).toString()));
//降序
if (sort.toUpperCase().equals(SORT_DESC)) {
return i2.compareTo(i1);
}
//升序
if (sort.toUpperCase().equals(SORT_ASC)) {
return i1.compareTo(i2);
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
});
}
/**
* 提取數字
*
* @param str
* @return
*/
public static String getNumber(String str) {
String regEx = "[^0-9]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return m.replaceAll("").trim();
}
}
其他的
List<UserInfo> userInfoList = new ArrayList<UserInfo>();
//降序
userInfoList.sort(Comparator.comparing(UserInfo::getCreateTime).reversed());
//升序
userInfoList.sort(Comparator.comparing(UserInfo::getCreateTime));
list = list.stream().sorted(Comparator.comparing(TestSort::getState)).collect(Collectors.toList());
//reversed()倒序排列,默認都是從小到大排序,加上reversed實現倒序
list = list.stream().sorted(Comparator.comparing(TestSort::getState)
.thenComparing(TestSort::getCode).reversed()).collect(Collectors.toList());