java.lang.Comparable接口
Comparable接口 是一个给排序方法使用的接口, 这是一个自比较器接口。 用于指定一个对象如何去比较大小。
Comparable接口中的方法
int compareTo(T obj) 比较当前对象与传入进来对象的大小 参数:obj 表示要比较的对象返回值: *如果当前的对象大于obj,返回正整数。 *如果当前的对象等于obj,返回0 *如果当前对象小于obj,返回负整
这是Java的一种约定, 当排序的sort()方法在对集合中的元素两两进行比较的时候会调用我们实现的compareTo(T obj)方法。 如果compareTo()返回正整数,则表示当前元素大于和它比较的元素; 如果返回负整数则表示当前元素小于和它比较的元素; 如果返回0,则表示两者相等。
案例演示
案例需求:
在数组中有三个员工对象,员工包含三个属性:编号、姓名、工资。 我们使用Arrays.sort()方法对数组中的员工按工资从小到大排序。
案例分析:
1) 创建员工实体类,包含属性int id,String name和int salary。 2) 通过员工的构造方法传入三个属性,生成toString()方法,生成无参的构造方法。 3) 员工实现Comparable接口,并且实现compareTo()方法:用当前员工工资减去另一个员工的工资 4) 在main函数中创建三个元素的数组,并且创建三个员工,添加到数组中。 5) 调用Arrays.sort()方法对员工进行排序 6) 思考:如果要按工资的降序排序如何实现?如果要用id排序呢?
案例代码:
//如果要比较大小,必须实现Comparable接口 class Employee implements Comparable<Employee> { private int id; private String name; private int salary; public int compareTo(Employee o) { //告诉sort()方法比较规则 return o.salary - this.salary; } } public class Demo03Comparable { public static void main(String[] args) { Employee[] employees = { new Employee(1, "孙悟空",7000), new Employee(2, "孙悟天",5000), new Employee(3, "孙悟饭",6000), }; System.out.println("排序前:"); for (Employee employee : employees) { System.out.println(employee); } //排序 Arrays.sort(employees); System.out.println("排序后:"); for (Employee employee : employees) { System.out.println(employee); } } }
java.util.Comparator接口
Comparator接口 创建一个比较器的接口,一个类实现这个接口,相当于指定了一个排序的规则。
Comparator接口中的方法
int compare(T obj1, T obj2) 比较o1和o2这两个对象如果: obj1 > obj2,这个方法返回正整数 obj2 == obj1, 返回0 obj1 < obj2,这个方法返回负整数
案例演示
需求说明
1) 定义一个学生类,成员变量有:姓名,年龄 2) 创建多个学生对象添加到集合中 3) 创建类Demo04Comparator按年龄从小到大对集合的学生对象进行排序
代码实现
class Student { private String name; private int age; private int score; } //年龄比较器 class AgeComparator implements Comparator<Student> { public int compare(Student o1, Student o2) { return o1.getAge() - o2.getAge(); } } //成绩比较器 class ScoreComparator implements Comparator<Student> { public int compare(Student o1, Student o2) { return o1.getScore() - o2.getScore(); } } public class Demo04Comparator { public static void main(String[] args) { //2) 创建多个学生对象添加到集合中 List<Student> students = new ArrayList<>(); students.add(new Student("张三",20,86)); students.add(new Student("李四",18,95)); students.add(new Student("老王",24,67)); System.out.println("排序前:"); System.out.println(students); //3) 创建类Demo04Comparator按年龄从小到大对集合的学生对象进行排序 Collections.sort(students, new AgeComparator()); System.out.println("年龄排序后:"); System.out.println(students); //按分数进行排序 Collections.sort(students, new ScoreComparator()); System.out.println("分数排序后:"); System.out.println(students); } }
Comparable和Comparator的区别
Comparable & Comparator 都是用来实现集合中的排序的, 只是 Comparable 是在对象内部定义的方法实现的排序,Comparator 是在集合外部实现的排序。 1) Comparable位于包java.lang下,Comparator位于包java.util下。 Comparable接口将比较代码嵌入自身类中,而Comparable在一个独立的类中实现比较。 2) 如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口, 可以通过Comparator 来实现比较算法进行排序。 3) Comparator为了使用不同的排序规则做准备。比如:升序、降序或按不同的属性进行排序。
字符串比较大小
字符串比较的规则
比较规则:
从字符串的第1个字符开始比较大小,比较它们的ASCII码值。 1) 大写字母小于小写字母,如:A 65 a 97 2) 所有的数字都小于字母
说出如下字符串的比较结果:
字符串1 | 结果 | 字符串2 |
---|---|---|
"abcde" | < | "ac" |
"abc" | > | "ab" |
"ab" | > | "AB" |
"1000" | < | "2" |
注:String、Integer、Double、Character、Boolean、Float类都已经实现了Comparable接口
public class Demo04String { public static void main(String[] args) { String s1 = "1000"; String s2 = "2"; String s3 = "4"; String s4 = "4"; System.out.println( s1.compareTo(s2)); //-1 System.out.println( s3.compareTo(s2)); //2 System.out.println( s3.compareTo(s4)); //0 } }
字符串排序案例
案例需求:
有一个字符串数组,包含5个字符串,请按从小到大的顺序输出字符串。 字符串数组如下:"Jack","Rose","make","tom","1000","9"
案例代码:
public class Demo05StringSort { public static void main(String[] args) { String[] names = {"Jack","Rose","make","tom","1000","9"}; System.out.println("排序前:"); System.out.println(Arrays.toString(names)); Arrays.sort(names); System.out.println("排序后:"); System.out.println(Arrays.toString(names)); //创建自定义的比较器 Arrays.sort(names, new Comparator<String>() { public int compare(String o1, String o2) { return o2.compareTo(o1); } }); System.out.println("排序后:"); System.out.println(Arrays.toString(names)); } }