1.Comparable
需要将所需排序的类实现Comparable接口,并实现内部的comparaTo方法,比较数值可用对应包装类的compare(也可以用做差形式),比较字符用String的compareTo自然情况都是从小到大排序,可在前面加个-号
2.Comparator
调用方法Collections.sort(list,new Comparator(){
public int compare(Person a,Person b){
return ;
})
重写内部的compare方法,重写方式和Comparable的相同
/** *作者:魏宝航 *2020年11月24日,上午20:30 */ import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Scanner; public class Java比较器 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); List<Person> list = new ArrayList<Person>(); Person p; for (int i = 0; i < n; i++) { p = new Person(); p.name = sc.next(); p.grade = sc.nextInt(); list.add(p); } //第一种是对排序的类进行实现comparable接口,重写内部的compareTo方法 //比较数值可用对应包装类的compare,比较字符用String的compareTo //自然情况都是从小到大排序,可在前面加个-号 Collections.sort(list); //第二种方式(利用比较器,自定义排序方式,重写compare方法) /*Collections.sort(list,new Comparator<Person>() { public int compare(Person a,Person b) { if(a.grade==b.grade) { return a.name.compareTo(b.name); } else { return -Integer.compare(a.grade, b.grade); } } });*/ Iterator<Person> iterator = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } } class Person implements Comparable<Person> { String name; int grade; public Person() { } public Person(String name, int grade) { this.name = name; this.grade = grade; } //重写方法,以便于输出想要数据 public String toString() { return name + " " + grade; } @Override public int compareTo(Person a) { if (this.grade == a.grade) return this.name.compareTo(a.name); else { return -Double.compare(this.grade, a.grade); } } }