快捷搜索:  汽车  科技

java集合怎么从小到大排序(JAVA集合自定义的顺序排序)

java集合怎么从小到大排序(JAVA集合自定义的顺序排序)collect(Collectors.toList());List orders = Stream.of("东部" "南部" "西部" "北部" "中部").1 0,-1的具体含义又怎样的呢?1表示两个数位置交换,-1表示两个数位置不交换,0表示两个相同元素不排序,要是我们把等于返回为-1,那么两个相同的元素会交互顺序通过Comparator 实现指定集合顺序

背景

java集合怎么从小到大排序(JAVA集合自定义的顺序排序)(1)

在工作中,有个统计列表数据。但数据本身没有排序的指标,导致有时返回前端的数据顺序不一致。后来为了解决问题,设定了一个固定的排序顺序,每次数据都进行排序。

概述

本文主要分享的几个部分。

  • 通过jdk 提供的接口实现排序。
  • 借助第三方工具实现排序

java集合怎么从小到大排序(JAVA集合自定义的顺序排序)(2)

Java 排序

java集合怎么从小到大排序(JAVA集合自定义的顺序排序)(3)

Comparator 简介

Comparator 接口中有个需要实现的函数。

比较其两个参数的顺序。当第一个参数小于,等于或大于第二个参数时,返回负整数,零或正整数。按照一般情况返回1 0,-1,通过这三个值来区分正,负值。当然返回其他的正数, 负数一样可以排序。

1 0,-1的具体含义又怎样的呢?

1表示两个数位置交换,-1表示两个数位置不交换,0表示两个相同元素不排序,要是我们把等于返回为-1,那么两个相同的元素会交互顺序

通过Comparator 实现指定集合顺序

List orders = Stream.of("东部" "南部" "西部" "北部" "中部").

collect(Collectors.toList());

List source = Stream.of("北部" "南部" "西部" "东部" "中部").

collect(Collectors.toList());

source.sort((o1 o2) -> {

if (orders.contains(o1) && orders.contains(o2)) {

if (orders.indexOf(o1) > orders.indexOf(o2)) {

return 1;

} else if (orders.indexOf(o1) == orders.indexOf(o2)) {

return 0;

} else {

return -1;

}

} else if (orders.contains(o1) && !orders.contains(o2)) {

return -1;

}

else if (!orders.contains(o1) && orders.contains(o2)) {

return 1;

}

return 0;

});

使用treeMap实现排序

TreeMap中的元素默认按照keys的自然排序排列。

(对Integer来说,其自然排序就是数字的升序;对String来说,其自然排序就是按照字母表排序)

Map<Integer String> tree = new TreeMap<Integer String>();

for (String code : source) {

if (orders.contains(code)) {

tree.put(orders.indexOf(code) code);

} else {

tree.put(source.size() code);

}

}

实现的原理,就是获取了字符在排序集合中的位置,然后借助TreeMap实现排序。

通过Google Guava实现

依赖

<dependency>

<groupId>com.google.guava</groupId>

<artifactId>guava</artifactId>

<version>28.1-jre</version>

</dependency>

代码实现片段

Commons Collections 实现

依赖

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-collections4</artifactId>

<version>4.3</version>

</dependency>

下面代码实例,实现指定顺序排序,且如果未识别的字符,放在最后

java集合怎么从小到大排序(JAVA集合自定义的顺序排序)(4)

不仅只是指定顺序,还可以设置指定中少的字符 的排序。

总结

这四种方式,个人推荐最后一种方式,虽然也是使用的Comparator接口,但已经进行了封装。还可以实现未指定字符排序。

当然如果你的项目中已经引入了Guava,可以自行实现,代码量也不大。

前面两种解决方式,实际过程中,需要考虑多种逻辑情况,相对比较复杂。

头条代码块出现了些问题,有需要的可以留言。

猜您喜欢: