好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java比较器实现方法项目案例

本文实例讲述了java 比较器 实现方法。分享给大家供大家参考,具体如下:

1 需求

一个项目,展示监控数据列表,数据来源于接口,不需要分页,目前可时长排序:

客户希望可先对【状态】分组,然后再对【时长】排序。

2 分析

考虑以下方案:

①.编写 js 脚本,在前端做分组排序。

②.利用 java 比较器,在后端做分组排序,前端直接渲染即可。

比较后发现使用 java 比较器实现,更方便些。

3 java 比较器

java 中有两种比较器的实现方式:comparable(内部比较器) 与 comparator(外部比较器)。

3.1 comparable 接口

代码模板:

?

1

2

3

4

5

6

public class entity implements comparable<entity> {

   @override

   public int compareto(entity o) {

     return 0 ;

   }

}

comparable 接口支持泛型参数,所以一个需要比较实体类只需要按照上面的代码模板实现 comparable 接口,即可对传入的另一个同类型的实体类进行比较啦。

因为比较方法是定义在实体类中,所以把它叫做内部比较器。

3.2 comparator 接口

代码模板:

?

1

2

3

4

5

6

public class entitycomparator implements comparator<entity> {

   @override

   public int compare(entity o1, entity o2) {

     return 0 ;

   }

}

comparator 接口同样也支持泛型参数。不同的是它是一个比较器类,所以叫它外部比较器。比较器类使用更灵活,我们可以定义多个比较器类用于不同的排序场景。

4 实战

因为业务场景需要先对【状态】分组排序后,然后再对【时长】排序,而【时长】的排序又可分为正序与逆序两种,所以我们采用 java 外部比较器来实现该业务逻辑。

待比较的实体类:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

public class record {

   //状态

   private string state;

   //时长

   private string time;

   public record(string state, string time) {

     this .state = state;

     this .time = time;

   }

   public string getstate() {

     return state;

   }

   public string gettime() {

     return time;

   }

   @override

   public string tostring() {

     return "record{" +

         "state='" + state + '\ '' +

         ", time='" + time + '\ '' +

         '}' ;

   }

}

比较器 a:先对【状态】排序,然后再对【时长】按正序排序

?

1

2

3

4

5

6

7

8

9

10

public class recordcomparator implements comparator<record> {

   @override

   public int compare(record o1, record o2) {

     final int statecompare = o1.getstate()测试数据pareto(o2.getstate());

     if (statecompare == 0 ) {

       return o1.gettime()测试数据pareto(o2.gettime());

     }

     return statecompare;

   }

}

比较器 b:先对【状态】排序,然后再对【时长】按逆序(倒序)排序

?

1

2

3

4

5

6

7

8

9

10

public class recordtimedesccomparator implements comparator<record> {

   @override

   public int compare(record o1, record o2) {

     final int statecompare = o1.getstate()测试数据pareto(o2.getstate());

     if (statecompare == 0 ) {

       return o2.gettime()测试数据pareto(o1.gettime());

     }

     return statecompare;

   }

}

单元测试:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

record record1 = new record( "通话中" , "00:01:08" );

record record2 = new record( "空闲" , "00:18:02" );

record record3 = new record( "通话中" , "00:04:04" );

record record4 = new record( "空闲" , "00:01:57" );

list<record> recordlist = new arraylist<>();

recordlist.add(record1);

recordlist.add(record2);

recordlist.add(record3);

recordlist.add(record4);

system.out.println( "排序前:" + recordlist);

collections.sort(recordlist, new recordcomparator());

system.out.println( "排序后【时间正序】:" + recordlist);

recordlist = new arraylist<>();

recordlist.add(record1);

recordlist.add(record2);

recordlist.add(record3);

recordlist.add(record4);

system.out.println( "排序前:" + recordlist);

collections.sort(recordlist, new recordtimedesccomparator());

system.out.println( "排序后【时间倒序】:" + recordlist);

输出结果:

排序前:[record{state='通话中', time='00:01:08'}, record{state='空闲', time='00:18:02'}, record{state='通话中', time='00:04:04'}, record{state='空闲', time='00:01:57'}]
排序后【时间正序】:[record{state='空闲', time='00:01:57'}, record{state='空闲', time='00:18:02'}, record{state='通话中', time='00:01:08'}, record{state='通话中', time='00:04:04'}]
排序前:[record{state='通话中', time='00:01:08'}, record{state='空闲', time='00:18:02'}, record{state='通话中', time='00:04:04'}, record{state='空闲', time='00:01:57'}]
排序后【时间倒序】:[record{state='空闲', time='00:18:02'}, record{state='空闲', time='00:01:57'}, record{state='通话中', time='00:04:04'}, record{state='通话中', time='00:01:08'}]

通过 java 比较器就可以把看似复杂的问题解决啦o(∩_∩)o哈哈~

希望本文所述对大家java程序设计有所帮助。

原文链接:https://blog.csdn.net/deniro_li/article/details/81698954

查看更多关于Java比较器实现方法项目案例的详细内容...

  阅读:16次