Java List 多维度排序 jdk8

在工作中遇到了需要按某一实体类多维度排序的场景。(Hbase备份Orcale字段 检索查询后order by操作)

  • 获取需要字段后封装进实体类,另外保存需要排序的字段。
public class SortEntity {
    private String entityString; //用于存放其余拼接字段
    private String compactor = null; // 第一个排序参数
    private String secondCompactor = null; // 第二个用于排序的参数
    private String thirdCompactor = null;//第三个排序参数

    public SortEntity() {
    }

    public SortEntity(String entityString, String compactor, String secondCompactor) {
        this.entityString=entityString;
        this.compactor=compactor;
        this.secondCompactor=secondCompactor;
    }

    public String getCompactor() {
        return compactor;
    }

    public void setCompactor(String compactor) {
        this.compactor = compactor;
    }

    public String getSecondCompactor() {
        return secondCompactor;
    }

    public void setSecondCompactor(String secondCompactor) {
        this.secondCompactor = secondCompactor;
    }

    public String getEntityString() {
        return entityString;
    }

    public void setEntityString(String entityString) {
        this.entityString = entityString;
    }

    public String getThirdCompactor() {
        return thirdCompactor;
    }

    public void setThirdCompactor(String thirdCompactor) {
        this.thirdCompactor = thirdCompactor;
    }

    @Override
    public String toString() {
        return "SortEntity [entityString=" + entityString + ", compactor=" + compactor + ", secondCompactor=" + secondCompactor + ", thirdCompactor=" + thirdCompactor + "]";
    }


}
  • 假设上述实体类就是需要的内容 利用jdk8 List Compactor进行排序:
/*
     * 
     * 功能:排序 
     * @param a 
     * @param b
     * @param desc  是否降序
     * @return
     */
    public static int compactor(String a,String b,boolean desc){
        if(desc)
            return -compactorS(a, b);
        else
            return compactorS(a, b);
    }

    /**
     * 
     * 功能:确保排序的如果是数字不可以带小数或者空格 否则就变为了字典顺序
     * @param a
     * @param b
     * @return
     */
    public static int compactorS(String a,String b){

        if(StringUtils.isNumeric(a)){
            return  compactorInteger(Integer.parseInt(a),Integer.parseInt(b));

        }else{
            return a.compareTo(b);
        }

    }


    public static int compactorInteger(Integer a,Integer b){
        if(a>b)return 1;
        if(a<b)return -1;
        return 0;
    }

public static void main(String[] args) {
        List<SortEntity> list = new ArrayList<>();

        list.add(new SortEntity("abc","3","5"));
        list.add(new SortEntity("abc","3","4"));
        list.add(new SortEntity("abc","4","3"));
        list.add(new SortEntity("abc","4","2"));
        list.add(new SortEntity("abc","4","3"));
        list.sort(Comparator.comparing(SortEntity::getCompactor,(f,s)->compactor(f, s,true))
                .thenComparing(SortEntity::getSecondCompactor,(f,s)-> compactor(f, s, true)));
        list.forEach(System.out::println);
    }

输出:

SortEntity [entityString=abc, compactor=4, secondCompactor=3, thirdCompactor=null]
SortEntity [entityString=abc, compactor=4, secondCompactor=3, thirdCompactor=null]
SortEntity [entityString=abc, compactor=4, secondCompactor=2, thirdCompactor=null]
SortEntity [entityString=abc, compactor=3, secondCompactor=5, thirdCompactor=null]
SortEntity [entityString=abc, compactor=3, secondCompactor=4, thirdCompactor=null]

关键代码解释:
list.sort(Comparator.comparing(SortEntity::getCompactor,(f,s)->compactor(f, s,true))
SortEntity::getCompactor,(f,s) f为当前SortEntity类getCompactor方法获取的值 s为下一个SortEntity类getCompactor方法获取的值, 之后使用compactor方法对比两个值。compactor返回结果为-1 f在s前面 ,为1 则f在s后面 。
多维则在后面增加thenComparing方法 即上述值为0时再执行。n维则添加n-1个thenComparing方法即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8中提供了多种排序方法,其中最常用的是Arrays.sort()和Collections.sort()方法。具体实现方式如下: 1.使用Arrays.sort()排序数组 可以使用Arrays.sort()方法对数组进行排序。该方法具有如下两种形式: - public static void sort(int[] a):对整型数组进行排序,按升序排列。 - public static void sort(Object[] a):对任意类型的对象数组进行排序,按升序排列。 示例代码: int[] arr = {3, 1, 4, 2, 5}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); 2.使用Collections.sort()排序集合 可以使用Collections.sort()方法对集合进行排序。该方法具有如下两种形式: - public static <T extends Comparable<? super T>> void sort(List<T> list):对实现了Comparable接口的对象进行排序,按升序排列。 - public static <T> void sort(List<T> list, Comparator<? super T> c):使用自定义比较器Comparator对集合进行排序。 示例代码: List<Integer> list = new ArrayList<>(); list.add(3); list.add(1); list.add(4); list.add(2); list.add(5); Collections.sort(list); System.out.println(list); 如果需要按照自定义规则进行排序,可以实现Comparator接口,并在sort()方法中传入该比较器对象。例如,按照字符串长度进行排序List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("orange"); Collections.sort(list, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.length() - o2.length(); } }); System.out.println(list);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值