Java根据集合元素中的某个属性进行排序

今天在项目中遇到的问题,不能在sql中进行order by。所以将数据库中查询出来的集合,在java代码中进行排序。

直接上代码:

package com.ly.hcms.common.utils;

import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * zhaoshuxiang
 */
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();
    }
}

或者纯lambda写法:

package com.ly.hcms.common.utils;

import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * zhaoshuxiang
 */
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, (o1, 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();
    }
}

参数说明:

  1. list 需排序的集合
  2. property 排序所依据的元素
  3. sort 排序方式

举例:

public class price {
        private String date;
        private BigDecimal dailyPrice;

        public String getDate() {
            return date;
        }

        public void setDate(String date) {
            this.date = date;
        }

        public BigDecimal getDailyPrice() {
            return dailyPrice;
        }

        public void setDailyPrice(BigDecimal dailyPrice) {
            this.dailyPrice = dailyPrice;
        }
    }

对List<Price> 根据Price的date元素正序排序写法:

SortUtil.sortList(prices, "date", "ASC");
  • 注:date 为String类型 值示例:2020-05-18
    排序时会转为Integer类型:20200518
根据提供的引用内容,可以使用Java 8的Stream API来根据类的某个字段去重LIST集合。可以使用`collectingAndThen`方法结合`toCollection`和`TreeSet`来实现去重操作。具体的代码如下所示: ``` List<User> lists = 从某处得来的集合; lists = lists.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getXxx))), ArrayList::new)); ``` 其,`User`是列表元素类型,`getXxx`是需要根据其字段进行去重的方法或属性。通过将列表转换为`TreeSet`,利用其自然排序和去重的特性,然后再将其转换回`ArrayList`,即可实现根据类的某个字段去重的操作。 #### 引用[.reference_title] - *1* *3* [list集合里的对象按某个字段去重](https://blog.csdn.net/weixin_43244841/article/details/120921375)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [list集合指定字段去重](https://blog.csdn.net/weixin_42464967/article/details/114162311)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子非鱼yy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值