打字猴:1.70044459e+09
1700444590
1700444591 Employee@1037c71[id=1001,name=张三,position=Boss]
1700444592
1700444593 Employee@b1c5fa[id=1002,name=李四,position=Staff]
1700444594
1700444595 Employee@f84386[id=1003,name=王五,position=Manager]
1700444596
1700444597 Employee@15d56d5[id=1005,name=马六,position=Staff]
1700444598
1700444599 Employee@efd552[id=1006,name=赵七,position=Manager]
1700444600
1700444601 是按照id号升序排列的,结果正确,但是,有时候我们希望按照职位来排序,那怎么做呢?此时,重构Employee类已经不合适了,Employee已经是一个稳定类,为了一个排序功能修改它不是一个好办法,那有什么更好的解决办法吗?
1700444602
1700444603 有办法,看Collections.sort方法,它有一个重载方法Collections.sort(List<T>list, Comparator<?super T>c),可以接受一个Comparator实现类,这下就好办了,代码如下:
1700444604
1700444605 class PositionComparator implements Comparator<Employee>{
1700444606
1700444607 @Override
1700444608
1700444609 public int compare(Employee o1,Employee o2){
1700444610
1700444611 //按照职位降序排列
1700444612
1700444613 return o1.getPosition().compareTo(o2.getPosition());
1700444614
1700444615 }
1700444616
1700444617 }
1700444618
1700444619 创建了一个职位排序法,依据职位的高低进行降序排列,然后只要把Collections.sort(list)修改为Collections.sort(list, new PositionComparator())即可实现按职位排序的要求。
1700444620
1700444621 现在问题又来了:按职位临时倒序排列呢?注意只是临时的,是否要重写一个排序器?完全不用,有两个解决办法:
1700444622
1700444623 直接使用Collections.reverse(List<?>list)方法实现倒序排列。
1700444624
1700444625 通过Collections.sort(list, Collections.reverseOrder(new PositionComparator()))也可以实现倒序排列。
1700444626
1700444627 第二个问题:先按照职位排序,职位相同再按照工号排序,这如何处理?这可是我们经常遇到的实际问题。很好处理,在compareTo或compare方法中先判断职位是否相等,相等的话再根据工号排序,使用apache的工具类来简化处理,代码如下:
1700444628
1700444629 public int compareTo(Employee o){
1700444630
1700444631 return new CompareToBuilder()
1700444632
1700444633 .append(position, o.position)//职位排序
1700444634
1700444635 .append(id, o.id).toComparison();//工号排序
1700444636
1700444637 }
1700444638
1700444639 在JDK中,对Collections.sort方法的解释是按照自然顺序进行升序排列,这种说法其实是不太准确的,sort方法的排序方式并不是一成不变的升序,也可能是倒序,这依赖于compareTo的返回值,我们知道如果compareTo返回负数,表明当前值比对比值小,零表示相等,正数表明当前值比对比值大,比如我们修改一下Employee的compareTo方法,如下所示:
[ 上一页 ]  [ :1.70044459e+09 ]  [ 下一页 ]