list集合进行排序时,很多人会考虑冒泡、快速等排序算法,但是对于多重排序规则的话,算法就不太适用了。其实java.util.collections
已经提供了sort
的排序方法,并且能自己实现其排序规则。
现在有个场景:我需要对一批优惠券进行排序,优惠券有三个属性:是否可用、券类型、面额。我需要将可用的、券类型最大的、面额最大的券排到最前面。
即优先按是否可用排序,其次是券类型,再者就是面额。
话不多说,看代码吧:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
package com.test;
import java.math.bigdecimal;
import java.util.arraylist;
import java.util.collections;
import java.util.comparator;
/**
* list多重规则排序测试类
*/
public class testcompartor {
public static void main(string[] args) {
arraylist<coupon> persons = new arraylist<coupon>();
persons.add( new coupon( 13 , 0 , new bigdecimal( 40 )));
persons.add( new coupon( 13 , 0 , new bigdecimal( 50 )));
persons.add( new coupon( 13 , 0 , new bigdecimal( 45 )));
persons.add( new coupon( 1 , 0 , new bigdecimal( 20 )));
persons.add( new coupon( 13 , 1 , new bigdecimal( 30 )));
persons.add( new coupon( 1 , 0 , new bigdecimal( 25 )));
persons.add( new coupon( 11 , 0 , new bigdecimal( 50 )));
persons.add( new coupon( 11 , 1 , new bigdecimal( 40 )));
system.out.println( "排序之前:" );
for ( int i = 0 ; i <persons.size(); i++) {
system.out.println(persons.get(i));
}
system.out.println();
collections.sort(persons, new comparator<coupon>() {
//按可用升序,券类型降序,面额降序
public int compare(coupon o1, coupon o2) {
if (o1.valueable.compareto(o2.valueable)== 0 ){
if (o2.themetype.compareto(o1.themetype)== 0 ){
return o2.amount.compareto(o1.amount)> 0 ? 1 :- 1 ;
} else {
return o2.themetype - o1.themetype;
}
} else {
return o1.valueable-o2.valueable ;
}
}
});
system.out.println( "排序后结果:" );
for ( int i = 0 ; i <persons.size(); i++) {
system.out.println(persons.get(i));
}
}
static class coupon{
public integer themetype; //优惠券类型
public integer valueable; //可用 ,0 可用,1不可用
public bigdecimal amount; //面额
@override
public string tostring() {
return "person{" +
"themetype=" + themetype +
", valueable=" + valueable +
", amount=" + amount +
'}' ;
}
public coupon(integer themetype, integer valueable, bigdecimal amount) {
super ();
this .themetype = themetype;
this .valueable = valueable;
this .amount = amount;
}
}
}
|
至于封装工具类我就懒得弄了,有需要的自己封装吧。
这里如果用了integer
等封装类型,最好自己也做下非空处理。
排序之前:
person{themetype=13, valueable=0, amount=40} person{themetype=13, valueable=0, amount=50} person{themetype=13, valueable=0, amount=45} person{themetype=1, valueable=0, amount=20} person{themetype=13, valueable=1, amount=30} person{themetype=1, valueable=0, amount=25} person{themetype=11, valueable=0, amount=50} person{themetype=11, valueable=1, amount=40}
排序后结果:
person{themetype=13, valueable=0, amount=50} person{themetype=13, valueable=0, amount=45} person{themetype=13, valueable=0, amount=40} person{themetype=11, valueable=0, amount=50} person{themetype=1, valueable=0, amount=25} person{themetype=1, valueable=0, amount=20} person{themetype=13, valueable=1, amount=30} person{themetype=11, valueable=1, amount=40}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。如果你想了解更多相关内容请查看下面相关链接
原文链接:https://blog.csdn.net/moneyshi/article/details/71108140