多种方案实现 java 中指定顺序排序

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

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

          public int compare(Object obj1,Object obj2);

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

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

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

通过Comparator 实现指定集合顺序
List<String> orders = Stream.of("东部", "南部", "西部", "北部", "中部").
collect(Collectors.toList());
List<String> 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实现排序
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>

实现代码

Ordering ordering = Ordering.explicit(orders);      
 source.sort((o1, o2) -> {        
  if (orders.contains(o1) && orders.contains(o2)){      
        return ordering.compare(o1,o2);      
    }          return 0;    
   });
Commons Collections 实现

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

FixedOrderComparator<String> fixedOrderComparator = new FixedOrderComparator<String>(orders);
fixedOrderComparator.setUnknownObjectBehavior(FixedOrderComparator.UnknownObjectBehavior.AFTER);
source.sort(fixedOrderComparator);

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

总结

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值