前言
平常使用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變得更簡潔些就行,這裏不再贅述。
有什麼問題,可以進行評論,咱們相互之間可以進行討論,