提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
写这篇文章的原因是前一晚参加字节笔试的时候,有道题目需要先对给定的数据进行自定义排序,再进行后面的操作,然而我已经有了大致的思想,就是不会排序,所以只能放弃,有点可惜。所以在这里写一篇文章记录一下Comparable和Comparator.
一、Comparable是什么
Comparable是一个接口,可以用类去实现该接口,并且要在该类中重写compareTo()方法,那么这个类就可以拥有一个自定义的排序了。
代码如下
import java.util.*;
import java.lang.Comparable;
public class Main
{
public static void main(String[] args)
{
// 新建ArrayList(动态数组)
ArrayList<Student> list = new ArrayList<Student>();
// 添加对象到ArrayList中
list.add(new Student("ccc", 20));
list.add(new Student("AAA", 30));
list.add(new Student("bbb", 10));
list.add(new Student("ddd", 40));
for (int i = 0; i < list.size(); ++ i) System.out.print(list.get(i).name + " ");
Collections.sort(list);
System.out.println();
for (int i = 0; i < list.size(); ++ i) System.out.print(list.get(i).name + " ");
}
private static class Student implements Comparable<Student>
{
int age;
String name;
public Student(String name, int age)
{
this.name = name;
this.age = age;
}
public int compareTo(Student o)
{
return name.compareTo(o.name);
}
}
}
输出结果如下
另外如果compareTo方法中,如果写的是age.compareTo(o.age)会报错,我认为可能是只支持引用数据类型,不支持基本数据类型吧。
二、使用Comparator
Comparator是一个比较器,需要实现的方法是compare方法即可,以下我用匿名类实现了。
代码如下:
import java.util.*;
import java.lang.Comparable;
public class Main
{
public static void main(String[] args)
{
List<int[]> map = new ArrayList<int[]>();
map.add(new int[]{8, 10});
map.add(new int[]{9, 11});
map.add(new int[]{15, 16});
map.add(new int[]{14, 15});
map.add(new int[]{10, 12});
for (int[] arr : map) System.out.print(arr[0] + " ");
System.out.println();
Collections.sort(map, new Comparator<int[]>()
{
public int compare(int[] o1, int[] o2)
{
return o1[0] - o2[0];
}
});
for (int[] arr : map) System.out.print(arr[0] + " ");
System.out.println();
}
}
根据第一个值来排序,输入结果如下:
总结
首先Comparable是接口,Comparator是比较器;
其次:实现前者需要实现compareTo()方法,实现后者需要实现compare()方法。
最后两者比较的时候,返回负数则按升序,正数则降序,总得来说,如果你想要升序排序,就用对象1减去对象2,降序用对象2-对象1即可。