前言
在我们的程序中,排序是非常常见的一种需求,提供一些数据元素,把这些数据元素按照一定的规则进行排序。比如查询一些订单,按照订单的日期进行排序;再比如查询一些商品,按照商品的价格进行排序等等。所以,接下来我们要学习一些常见的排序算法。
在java的开发工具包jdk中,已经给我们提供了很多数据结构与算法的实现,比如List,Set,Map,Math等等,都是以API的方式提供,这种方式的好处在于一次编写,多处使用。我们借鉴jdk的方式,也把算法封装到某个类中,那如果是这样,在我们写java代码之前,就需要先进行API的设计,设计好之后,再对这些API进行实现。
一、Comparable接口介绍
由于我们这里要讲排序,所以肯定会在元素之间进行比较,而Java提供了一个接口Comparable就是用来定义排序规则的,在这里我们以案例的形式对Comparable接口做一个简单的回顾。Comparable接口是用来实现对象的排序比较的一个接口,一般自定对象要实现按照一定规则进行排序(比如说要求按照升序或者是降序排列显示),那么可以让需要排序的对象的类去实现“Comparable”接口,然后覆写该接口的一个compareTol),排序的规则就是在该方法定义的。
二、接口使用
1.代码实现
1.定义一个学生类Student,具有年龄age和姓名username两个属性,并通过Comparable接口提供比较规则;
2.定义测试类Test,在测试类Test中定义测试方法Comparable getMax(Comparable c1,Comparable c2)完成测试
代码如下(示例):
实现Comparable的学生类
//学生类 public class Student implements Comparable<Student>{ private String username; private int age; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [age=" + age + ", username=" + username + "]"; } @Override public int compareTo(Student o) { // TODO Auto-generated method stub JAVA_TOOL_OPTIONS -Dfile.encoding=UTF-8 return this.getAge() - o.getAge(); } }
测试类
//测试类 public class TestComparable { public static void main(String[] args){ Student s1 = new Student(); s1.setUsername("CSH"); s1.setAge(24); Student s2 = new Student(); s2.setUsername("JMFive"); s2.setAge(17); // 使用Comparable类<T>的类型 Comparable<Student> max = getMax(s1, s2); System.out.println(max); } // 这里Student c1不能有Comparable c1,这样会有警告 public static Comparable<Student> getMax(Student c1, Student c2){ int result = c1.compareTo(c2); if(result>=0){ return c1; }else{ return c2; } } }
2.运行结果
编写完成之后,点击运行就能根据要求比较都这两个对象的大小了,如下图所示:
总结
1、如果类的对象集合或者是数组要进行排序,则可以实现 Comparable 接口
2、其实上Arrays的sort方法中会调用我们覆写的compareTo方法,根据这个方法的返回值来确定哪一个对象在前面。