java集合怎么从小到大排序(JAVA集合自定义的顺序排序)
java集合怎么从小到大排序(JAVA集合自定义的顺序排序)collect(Collectors.toList());List orders = Stream.of("东部" "南部" "西部" "北部" "中部").1 0,-1的具体含义又怎样的呢?1表示两个数位置交换,-1表示两个数位置不交换,0表示两个相同元素不排序,要是我们把等于返回为-1,那么两个相同的元素会交互顺序通过Comparator 实现指定集合顺序
背景在工作中,有个统计列表数据。但数据本身没有排序的指标,导致有时返回前端的数据顺序不一致。后来为了解决问题,设定了一个固定的排序顺序,每次数据都进行排序。
概述本文主要分享的几个部分。
- 通过jdk 提供的接口实现排序。
- 借助第三方工具实现排序
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>
下面代码实例,实现指定顺序排序,且如果未识别的字符,放在最后
不仅只是指定顺序,还可以设置指定中少的字符 的排序。
总结这四种方式,个人推荐最后一种方式,虽然也是使用的Comparator接口,但已经进行了封装。还可以实现未指定字符排序。
当然如果你的项目中已经引入了Guava,可以自行实现,代码量也不大。
前面两种解决方式,实际过程中,需要考虑多种逻辑情况,相对比较复杂。
头条代码块出现了些问题,有需要的可以留言。