1、基本类型数据,可以直接排序
可以使用Arrays.sort()对int、double、long等基本类型的数组进行排序,也包括String对象。
import java.util.Arrays;
public class SortDemo {
public static void main(String[] args) {
// String和基本类型对象排序
String[] str=new String[] {"ad","abc","bd","dc","bb"};
int[] number=new int[] {8,17,11,0,-7,9};
for(var t:str) {
System.out.print(t+"\t");
}
System.out.println();
for(var t:number) {
System.out.print(t+"\t");
}
Arrays.sort(str);
Arrays.sort(number);
System.out.println();
System.out.println("================排序后================");
for(var t:str) {
System.out.print(t+"\t");
}
System.out.println();
for(var t:number) {
System.out.print(t+"\t");
}
}
}
2、非基本类型对象排序方法
public interface Comparable 该接口对实现它的每个类的对象强加一个整体排序。 这个排序被称为类的自然排序 ,类的compareTo方法被称为其自然比较方法 。
Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
所以,我们可以给该类编写一个排序方法,方法就是继承并实现Comparable接口
import java.util.Arrays;
//学生类
class Student implements Comparable{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return this.name;
}
@Override
public int compareTo(Student o) {
return this.age-o.age;
}
}
public class SortDemo {
public static void main(String[] args) {
// 学生类对象排序
Student[] obj=new Student[] {
new Student("老三",14),new Student("老二",15),
new Student("老五",13),new Student("老大",16),
new Student("老六",12),new Student("老四",13)};
for(var t:obj) {
System.out.print(t.getName()+"\t");
}
System.out.println();
Arrays.sort(obj);
System.out.println("================排序后================");
for(var t:obj) {
System.out.print(t.getName()+"\t");
}
}
}
Comparator简介
Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。
import java.util.Arrays;
import java.util.Comparator;
//学生类
class Student{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
}
//比较器类
class StudentCompartor implements Comparator{
@Override
public int compare(Student o1, Student o2) {
return o1.getAge()-o2.getAge();
}
}
public class SortDemo {
public static void main(String[] args) {
// 学生类对象排序
Student[] obj=new Student[] {
new Student("老三",14),new Student("老二",15),
new Student("老五",13),new Student("老大",16),
new Student("老六",12),new Student("老四",13)};
for(var t:obj) {
System.out.print(t.getName()+"\t");
}
System.out.println();
Arrays.sort(obj,new StudentCompartor());
System.out.println("================排序后================");
for(var t:obj) {
System.out.print(t.getName()+"\t");
}
}
}
3、Comparable和Comparator区别比较
Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。
用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。