JAVA集合多字段排序方法


排序方法

List<類> list; 代表某集合
 
  
//返回 對象集合以類屬性一升序排序
list.stream().sorted(Comparator.comparing(類::屬性一));


//返回 對象集合以類屬性一降序排序 注意兩種寫法
list.stream().sorted(Comparator.comparing(類::屬性一).reversed());//先以屬性一升序,對升序結果進行屬性一降序
list.stream().sorted(Comparator.comparing(類::屬性一,Comparator.reverseOrder()));//以屬性一降序
 

//返回 對象集合以類屬性一升序 屬性二升序
list.stream().sorted(Comparator.comparing(類::屬性一).thenComparing(類::屬性二));


//返回 對象集合以類屬性一降序 屬性二升序 注意兩種寫法
list.stream().sorted(Comparator.comparing(類::屬性一).reversed().thenComparing(類::屬性二));//先以屬性一升序,對升序結果進行屬性一降序,再進行屬性二升序
list.stream().sorted(Comparator.comparing(類::屬性一,Comparator.reverseOrder()).thenComparing(類::屬性二));//先以屬性一降序,再進行屬性二升序
 

//返回 對象集合以類屬性一降序 屬性二降序 注意兩種寫法
list.stream().sorted(Comparator.comparing(類::屬性一).reversed().thenComparing(類::屬性二,Comparator.reverseOrder()));//先以屬性一升序,對升序結果進行屬性一降序,再進行屬性二降序
list.stream().sorted(Comparator.comparing(類::屬性一,Comparator.reverseOrder()).thenComparing(類::屬性二,Comparator.reverseOrder()));//先以屬性一降序,再進行屬性二降序
 

//返回 對象集合以類屬性一升序 屬性二降序 注意兩種寫法
list.stream().sorted(Comparator.comparing(類::屬性一).reversed().thenComparing(類::屬性二).reversed());//先以屬性一升序,對升序結果進行屬性一降序,再進行屬性二升序,對前面結果進行屬性一降序屬性二降序(優先按照屬性一降序,屬性一相等時再按照屬性二降序)
list.stream().sorted(Comparator.comparing(類::屬性一).thenComparing(類::屬性二,Comparator.reverseOrder()));//先以屬性一升序,再進行屬性二降序

通過以上例子我們可以發現

  1. Comparator.comparing(類::屬性一).reversed();

  2. Comparator.comparing(類::屬性一,Comparator.reverseOrder());

兩種排序是完全不一樣的,一定要區分開來

1、是得到排序結果后再排序,

2、是直接進行排序,很多人會混淆導致理解出錯,2更好理解,建議使用2

實際例子:

有個Img類,有個排序號sort和創建時間createTime,要求先按照sort正序排列,然后按照createTime倒序排列

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;

import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Data
@ToString
public class Img {
    @ApiModelProperty(value = "id")
    private Integer id;
    @ApiModelProperty(value = "排序號")
    private Integer sort;
    @ApiModelProperty(value = "創建時間")
    private Date createTime;

    public static void main(String[] args) {
        List<Img> list = CollUtil.newArrayList();
        for (int i = 1; i <= 3; i++) {
            Img img = new Img();
            img.setId(i);
            img.setSort(i != 1 ? 2 : 1);
            img.setCreateTime(i == 1 ? DateUtil.offset(new Date(), DateField.MINUTE, 3) : i == 2 ? DateUtil.offset(new Date(), DateField.MINUTE, 1) : DateUtil.offset(new Date(), DateField.MINUTE, 2));
            list.add(img);
        }
        log.info("現有集合");
        list.stream().forEach(item -> System.out.println(item));
        log.info("使用reversed()排序");
        List<Img> imgList = list.stream().sorted(Comparator.comparing(Img::getSort).thenComparing(Img::getCreateTime).reversed()).collect(Collectors.toList());
        imgList.stream().forEach(item -> System.out.println(item));
        log.info("使用Comparator.reverseOrder()排序");
        List<Img> imgs = list.stream().sorted(Comparator.comparing(Img::getSort).thenComparing(Img::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
        imgs.stream().forEach(item -> System.out.println(item));
    }
}

打印結果

10:32:25.368 [main] INFO com.eternity.scrapy.modules.entity.Img - 現有集合
Img(id=1, sort=1, createTime=2022-02-09 10:35:25)
Img(id=2, sort=2, createTime=2022-02-09 10:33:25)
Img(id=3, sort=2, createTime=2022-02-09 10:34:25)
10:32:25.577 [main] INFO com.eternity.scrapy.modules.entity.Img - 使用reversed()排序
Img(id=3, sort=2, createTime=2022-02-09 10:34:25)
Img(id=2, sort=2, createTime=2022-02-09 10:33:25)
Img(id=1, sort=1, createTime=2022-02-09 10:35:25)
10:32:25.630 [main] INFO com.eternity.scrapy.modules.entity.Img - 使用Comparator.reverseOrder()排序
Img(id=1, sort=1, createTime=2022-02-09 10:35:25)
Img(id=3, sort=2, createTime=2022-02-09 10:34:25)
Img(id=2, sort=2, createTime=2022-02-09 10:33:25)

站在巨人肩膀上摘蘋果

https://www.cnblogs.com/kuanglongblogs/p/11230250.html


免責聲明!

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



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