欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

像使用SQL一样对List对象集合进行排序

程序员文章站 2023-10-29 07:59:51
在开始之前,我先卖个关子提一个问题:假设我们有一个Movie类,这个类有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分)。你知道怎么对一个Movie对象组成的List集合,先按照是否收藏字段倒序排序,再按照评分的倒序进行排序么?如果您不知道4行代码以内的 ......

像使用SQL一样对List对象集合进行排序

在开始之前,我先卖个关子提一个问题:假设我们有一个movie类,这个类有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分)。你知道怎么对一个movie对象组成的list集合,先按照是否收藏字段倒序排序,再按照评分的倒序进行排序么?如果您不知道4行代码以内的解决方案(其实是1行代码就可以实现,但笔者格式化为4行),我觉得您有必要一步步的看下去。

在java 8 之前,实现对象collection排序,集合中被排序和比较大小的对象得实现comparable接口。在java 8之后,有了comparator比较器的概念,使用comparator完成对象数组的排序更加方便快捷,下面就给大家简单的介绍一下java 8中使用comparator排序的方法。

一、字符串list排序

像使用SQL一样对List对象集合进行排序

  • cities是一个字符串数组。注意london的首字母是小写的。
  • 当使用sort方法,按照string.case_insensitive_order(字母大小写不敏感)的规则排序,结果是:[london, milan, new delhi, san francisco, tokyo]
  • 如果使用comparator.naturalorder()字母自然顺序排序,结果是:[milan, new delhi, san francisco, tokyo, london]

在java 7我们是使用collections.sort()接受一个数组参数,对数组进行排序。在java 8之后可以直接调用集合类的sort()方法进行排序。sort()方法可以传入一个字符串的排序规则,如:string.case_insensitive_order,也可以传入一个排序器comparator.naturalorder()作为参数。

二、整数类型list排序

像使用SQL一样对List对象集合进行排序

按数字的自然顺序排序,结果是[1, 2, 4, 6, 9]

三、按对象字段对对象list排序

这个功能就比较有意思了,举个例子大家理解一下。假设我们有一个类movie,有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分)。

像使用SQL一样对List对象集合进行排序

  • 首先,我们创建了四个movie对象,然后将它们转换为list
  • 然后重点的的代码:使用了函数应用movie::gettitle作为对象的排序字段,即按照电影的title作为排序字段
  • 然后调用list的foreach方法将list排序结果打印出来,如下(当然我们重写了tostring方法,不然打印结果没有意义):

像使用SQL一样对List对象集合进行排序

  • 如果我们希望list按照title的倒序排序,就使用reversed()方法。如:comparator.comparing(movie::gettitle).reversed()。

四、使用自定义comparator排序

我们自定义一个排序器,实现compare函数。返回0表示元素相等,-1表示前一个元素小于后一个元素,1表示前一个元素大于后一个元素。这个规则似乎和java 8之前没什么区别。

像使用SQL一样对List对象集合进行排序

最终的打印结果如下,按照started的自定义规则进行排序。

像使用SQL一样对List对象集合进行排序

这段代码如果以lambda表达式简写。箭头左侧是参数,右侧是函数体,参数类型和返回值根据上下文自动判断。如下:

像使用SQL一样对List对象集合进行排序

五、通过comparator链对对象list排序

像使用SQL一样对List对象集合进行排序

上面这段代码先是按是否收藏的倒序排序,再按照电影的评分大小的倒序排序,排序结果如下:

像使用SQL一样对List对象集合进行排序

期待您的关注