在Java中经常会涉及到对象数组的排序问题,就会涉及到对象之间的比较问题。
Java实现对象排序的方式有两种:
- 自然排序:Comparable
- 定制排序:Comparator
1、Comparable 自然排序
Comparable接口强行对实现它的每个类的对象进行整体排序,实现Comparable的类必须实现compareTo(Object obj)方法,返回int类型,如果当前对象this大于形参obj对象,返回正整数,如果当前对象this小于形参obj对象,返回负整数,等于就返回0.
public interface Comparable<T> {
public int compareTo(T o);
}
在实现Comparable接口的对象列表(数组)可以通过Collections.sort 或者(Arrays.sort)进行自动排序。在String、包装类等都实现了Comparable接口。
代码演示:根据对象的年龄来排序
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Comparable 接口的使用比较对象的具体属性
*/
public class ComparableTest {
public static void main(String[] args) {
Student s1 = new Student("李四", 12);
Student s2 = new Student("张三", 10);
Student s3 = new Student("李富贵", 40);
Student s4 = new Student("李文", 30);
List<Student> list = new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
Collections.sort(list);
for (Student student : list) {
System.out.println(student);
}
}
}
class Student implements Comparable<Student>{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) {
return getAge()-o.getAge();
}
}
运行截图: 默认是从小到大排序
对于String、包装类的自然排序:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
String []str = new String[]{"AA","D","TT","FF"};
Arrays.sort(str);
for (String s : str) {
System.out.print(s+" ");
}
System.out.println();
Integer []integers = new Integer[]{1,2,3,10,1,23};
Arrays.sort(integers);
for (Integer integer : integers) {
System.out.print(integer+" ");
}
}
}
运行截图:String、Integer包装类都实现了Comparable接口。
2、 Comparator 定制排序
当元素的类型没有实现Comparable接口,不好修改代码时或者Comparable接口比较的规则不适合当前的操作,强行对两个对象进行排序。可以考虑Comparator接口。
重写compare(Object o1,Object o2)方法,如果返回正整数,表示o1大于o2,如果返回负整数,表示o1小于o2;返回0则表示o1等于o2.
public interface Comparator<T> {
//还有其他静态方法
int compare(T o1, T o2);
}
在实现Comparator接口的对象列表(数组)可以通过Collections.sort 或者(Arrays.sort)进行自动排序。在String、包装类等都实现了Comparator接口。
代码演示:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class TestComareT {
public static void main(String[] args) {
Teacher t1 = new Teacher(10000, "lisi", "男");
Teacher t2 = new Teacher(12000, "zs", "女");
Teacher t3 = new Teacher(10300, "ww", "男");
List<Teacher> teachers = new ArrayList<>();
teachers.add(t1);
teachers.add(t2);
teachers.add(t3);
Collections.sort(teachers, new Comparator<Teacher>() {
@Override
public int compare(Teacher o1, Teacher o2) {
if (o1.getWages() - o2.getWages() > 0) {
return -1;
}
if (o1.getWages() - o2.getWages() < 0) {
return 1;
}
return 0;
}
});
for (Teacher teacher : teachers) {
System.out.println(teacher);
}
}
}
class Teacher {
private double wages;
private String name;
private String sex;
public Teacher() {
}
public Teacher(double wages, String name, String sex) {
this.wages = wages;
this.name = name;
this.sex = sex;
}
public double getWages() {
return wages;
}
public void setWages(double wages) {
this.wages = wages;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Teacher{" +
"wages=" + wages +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
运行截图:按照工资从小到大排序
对于String、包装类的排序:
import java.util.Arrays;
import java.util.Comparator;
public class TestComparator {
public static void main(String[] args) {
String []str = new String[]{"AA","D","TT","FF"};
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return - o1.compareTo(o2);//从大到小排序
}
});
for (String s : str) {
System.out.print(s+" ");
}
System.out.println();
Integer []integers = new Integer[]{1,2,3,10,1,23};
Arrays.sort(integers, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return - o1.compareTo(o2);//从大到小排序
}
});
for (Integer integer : integers) {
System.out.print(integer+" ");
}
}
}
运行截图: