Java使用lambda對List,Set進行排序

前言

平常使用List和Set進行排序,還是很常見的,大多數的場景是對Integer,String,Long這種的排序,那麼我今天先總結下難的,對一個實體類進行排序。

正文

首先定義一個實體類:

package model;

/**
 * 介紹人的實體類
 * @author luckyharry
 *
 */
public class Person {

    /**
     * 人名
     */
    private String name;
    
    /**
     * 人的年齡
     */
    private int age;
    
    /**
     * 人的體重
     */
    private double weight;
    
    /**
     * 人的身高
     */
    private int height;

    
    public Person(String name, int age, double weight, int height) {
        super();
        this.name = name;
        this.age = age;
        this.weight = weight;
        this.height = height;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", weight=" + weight + ", height=" + height + "]";
    }
    
    
}

然後是排序的邏輯代碼

package lambda;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import model.Person;

/**
 * 對Person對象進行排序的例子
 * @author luckyharry
 *
 */
public class SortUtil {

    /*
     * Comparator是進行排序的關鍵所在
     * 這種排序方法首先根據person的名稱 使用了String自帶的一個Comparator -> CASE_INSENSITIVE_ORDER(忽略大小寫,從小到大排序),
     * 如果名稱相等,根據年齡,
     * 如果年齡相等,根據身高,
     * 如果身高相等,根據體重。
     * 
     * 在我看來這個比較已經是個挺複雜的了,一般情況下只根據一個屬性,或者兩個屬性排序是大多數的情況
     * 
     * 除了comparing方法之外,還有comparingInt,comparingLong,comparingDouble可供選擇。
     * thenComparing的方法種類,同上
     * 
     * 如果想進行倒序可以使用reversed()方法
     */
    private static Comparator<Person> personComparator = Comparator
            .comparing( Person::getName, String.CASE_INSENSITIVE_ORDER)
            .thenComparingInt(person -> person.getAge())
            .thenComparingInt(person -> person.getHeight())
            .thenComparingDouble(person -> person.getWeight());
    
    public static void  main(String[] args) {
        
        //對list進行排序
        List<Person> list = new ArrayList<Person>();
        list.add(new Person("aa",15,60.00,170));
        list.add(new Person("aa",15,40.00,176));
        list.add(new Person("aa",17,66.00,174));
        list.add(new Person("aa",15,60.00,173));
        list.add(new Person("aa",14,70.00,172));
        list.add(new Person("aa",15,60.00,170));
        list.add(new Person("aa",13,80.00,175));
        list.add(new Person("aa",15,45.00,172));
        list.sort(personComparator);
        
        //對set進行排序
        Set<Person> set = new TreeSet<Person>(personComparator);
        set.add(new Person("aa",15,60.00,170));
        set.add(new Person("aa",15,40.00,176));
        set.add(new Person("aa",17,66.00,174));
        set.add(new Person("aa",15,60.00,173));
        set.add(new Person("aa",14,70.00,172));
        set.add(new Person("aa",15,60.00,170));
        set.add(new Person("aa",13,80.00,175));
        set.add(new Person("aa",15,45.00,172));
        
        
        
        System.out.println(list);
        //打印set的時候你會發現,list中打印出來了8個,而set中只有七個,是因爲,有一個person對象的值,完全相同,hashcode值相等導致的
        System.out.println(set);
    }
}

需要注意和使用的地方,我已經在代碼裏做了註釋。
順便說一嘴,如果我們只希望排序那些基本類型的封裝類,那麼只需要把Compartor變得更簡潔些就行,這裏不再贅述。
有什麼問題,可以進行評論,咱們相互之間可以進行討論,

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