JAVA中 List集合如何按某個字段升序或降序排序

第一種:比較標準的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());

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章