首页 > 编程语言 >Java8中的sort与Comparator、Comparable

Java8中的sort与Comparator、Comparable

时间:2023-05-11 18:23:28浏览次数:40  
标签:sort Comparable CoinUserIncome id objects compareTo Java8 availableNum

基本含义

在Java8中,sort() 方法、Comparator 接口和 Comparable 接口是用于对数组或集合进行排序的重要工具,其中 Comparator 接口适用于自定义比较规则,而 Comparable 接口适用于定义对象自身的比较规则。
假如我们有一个实体类

点击查看代码
public class CoinUserIncome{
    private Long id;
    private Integer availableNum;
}

如果想要对id进行排序,一般我们有以下几种方式。

点击查看代码
List<CoinUserIncome> objects = Lists.newArrayList();
        objects.add(CoinUserIncome.builder().id(100L).availableNum(100).build());
        objects.add(CoinUserIncome.builder().id(20L).availableNum(100).build());
        objects.add(CoinUserIncome.builder().id(200L).availableNum(100).build());
        objects.add(CoinUserIncome.builder().id(200L).availableNum(20).build());
        // 第一种
        objects.sort(Comparator.comparing(CoinUserIncome::getId));
        // 第二种 先对id排序后降序,再在id的基础上对availableNum排序后降序
        objects = objects.stream().sorted(Comparator.comparing(CoinUserIncome::getId).reversed().thenComparing(Comparator.comparing(CoinUserIncome::getAvailableNum).reversed()))
                .collect(Collectors.toList());
        // 通过内部重写compareTo方法排序,compareTo这个方法可以是任意类里的一个方法
        objects = objects.stream().sorted((t1, t2) -> compareTo_sort(t1, t2)).collect(Collectors.toList());
        // 第四种,CoinUserIncome类实现Comparable接口,重新compareTo方法,当调用sorted方法的时候,会默认调用实现好的compareTo方法
        objects = objects.stream().sorted().collect(Collectors.toList());

        System.out.println(JSON.toJSONString(objects));


public int compareTo_sort(CoinUserIncome other1 ,CoinUserIncome other) {
        if (other1.getId().compareTo(other.getId()) != 0) {
            return -other1.getId().compareTo(other.getId());
        }
        return -other1.getAvailableNum().compareTo(other.getAvailableNum());
    }
点击查看代码

实现Comparable接口

public class CoinUserIncome implements Comparable<CoinUserIncome> {
    private Long id;
    private Integer availableNum;

    // 构造方法、getter 和 setter 略

    @Override
    public int compareTo(CoinUserIncome other) {
        if (this.id.compareTo(other.id) != 0) {
            return this.id.compareTo(other.id);
        }
        return this.availableNum.compareTo(other.availableNum);
    }
}

其实不用Comparable接口也是可以通过其他三种方式实现排序的,

标签:sort,Comparable,CoinUserIncome,id,objects,compareTo,Java8,availableNum
From: https://www.cnblogs.com/kangyu222/p/17391871.html

相关文章

  • Java8相对于Java7新增了什么新特性
    Java8和Java7是两个不同的Java版本,Java8相对于Java7引入了相当多的新特性,以下是Java8相对于Java7新增的重要特性:Lambda表达式:Lambda表达式是Java8最重要的特性之一,它提供了一种简洁的编写匿名函数的方式,有助于编写更加易读和简单的代码。函数式接口和......
  • java8 数组使用流和收集器格式化拼接数组中字符串并以“,”间隔,且首尾分别用 “[” 和
    方法:Stringresult=artist.stream().map(Art::getName).collect(Collectors.joining(",","[","]"));(注:joining(CharSequencedelimiter,CharSequenceprefix,CharSequencesuffix)方法接受一个字符串序列作为拼接符,并在拼接完成后添加传递的前缀和后缀。假如我们传递的分......
  • java8 数据分组的两种方式?
    第一种:使用partitioningBy收集器例子:Map<Boolean,List<Art>>= artist.stream.collect(partitioningBy(x->x.isSolo()));根据true,false分类,满足条件的返回到true,不满足的返回到false第二种:使用groupingBy分组Map<String,List<Art>>= artist.stream.collect(groupin......
  • 拓扑排序 - TopoSort
    拓扑排序-TopoSort前言wcy终于考上了心仪的大学,开启了精彩的大学生活!然而光是选课这一件事就把他难住了,因为一些课程包含先修课程:课程编号课程名称先修课程C1高等数学无C2程序设计基础无C3离散数学C1,C2C4数据结构C2,C3C5算法语言C2C6......
  • java8一个List转化为另外一个List
    List<String>filterTags=Lists.newArrayList();List<Promotion>promotionList=filterTags.stream().map(f->{Promotiontag=newPromotion(context);tag.setLabel(f);tag.setCode(f);......
  • sort和sorted
    sorted()函数对所有可迭代的对象进行排序操作。sort与sorted区别:sort是应用在list上的方法,sorted可以对所有可迭代的对象进行排序操作。list的sort方法返回的是对已经存在的列表进行操作,无返回值,而内建函数sorted方法返回的是一个新的list,而不是在原来的基础上......
  • sort代码
    #include<stdio.h>#include<stdlib.h>intm[]={10,9,8,2,3,1}; inti=0; intN=6;voidBubbleSort(inta[],intN){ intflag=0; intmid=0; inti=0,j=0; for(i=0;i<N-1;i++) { for(j=N-1;j>i;j--) { if(a[......
  • vue sort 排序方法
    1、数据排序vararry=[9,5,6,7,5,6,3,1,0]arry.sort()//[0,1,3,5,5,6,6,7,9] 2、对象排序varlist=[{name:'张三',age:12},{name:'李四','age:23}];list.sort((a,b)=>{returna.age-b.age});//[{name:'李四','ag......
  • Windows11实现java8和java11自由切换
    由于运行不同的软件需要不同的java版本,因此需要不时切换java环境。以下基于win11实现java8和java11环境自由切换。第一步:安装jdk8和jdk11傻瓜式安装,点击下一步即可。需要记住安装路径。安装完成后如图所示:第二步:将jdk8和jdk11安装路径添加至系统变量新建两个系统变量,指定jav......
  • Java8 Stream流的合并
    最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性。比如一个Customer对象,有3个Id:id1,id2,id3,要把这些Id全部取出来,然后去数据库里查询它是否存在。@Data@AllArgsConstructorpublicclassCustomer{privateStringname;privateStringid1;p......