java多字段排序


java多字段排序

java8中,可以用Lambda的sorted進行排序。
有時我們還需要對多個字段進行排序。
多個字段排序,先對第一個排序字段排序,當第一個排序字段相同時,會使用第二個排序字段進行排序。

多字段排序的api

  • 多個字段排序的格式
//第一個排序字段
Comparator<對象名> comparatorFirst = Comparator.comparing(對象名::方法名1);
//第二個排序字段,如果需要倒序就可以用reversed,不需要倒序就不用加 reversed
Comparator<對象名> comparatorSecond = Comparator.comparing(對象名::方法名2).reversed();
//多個字段排序
Comparator<對象名> comparator = comparatorFirst.thenComparing(comparatorSecond);

當然,也可以直接連起來寫:

Comparator<對象名> comparator = Comparator.comparing(對象名::方法名1)
		.thenComparing(Comparator.comparing(對象名::方法名2).reversed());

如果是三個以上的字段排序,就繼續用 thenComparing 連接。

示例

  • 對象類:
public class Order {

    private String weight;

    private double price;

    private int age ;

	//getter、 setter、構造方法
}

  • 多個字段排序:
public static void orderFields() {
	Order order1=new Order();
	order1.setAge(10);order1.setPrice(1.3);
	Order order2=new Order();
	order2.setAge(10);order2.setPrice(33.6);
	Order order3=new Order();
	order3.setAge(66);order3.setPrice(55.8);
	Order order4=new Order();
	order4.setAge(33);order4.setPrice(55.3);

	List<Order> list= new ArrayList<>();
	list.add(order1);
	list.add(order2);
	list.add(order3);
	list.add(order4);

	//多個字段排序
	Comparator<Order> comparator = Comparator.comparing(Order::getAge)
			.thenComparing(Comparator.comparing(Order::getPrice).reversed());

	List<Order> orderList = list.parallelStream()
			.filter(Objects::nonNull)
			.sorted(comparator)
			.collect(Collectors.toList());

	orderList.forEach(o -> System.out.println("age:"+ o.getAge()+",price:"+o.getPrice()));
	
}

輸出結果如下,可以看到:
多個字段排序,先按age升序,age相同的,就按price降序。

age:10,price:33.6
age:10,price:1.3
age:33,price:55.3
age:66,price:55.8

參考資料:

https://www.cnblogs.com/expiator/p/14751838.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM