关于comparable和comparator接口

接口 Comparable<T>

此接口强制为实现它的每个类对象进行整体排序,这种排序被称为自然排序,类的comparaTo方法被称为自然比较方法;

实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。

public static void main(String[] args) { int[] arry = {2,4,1,9,6,8,3,7,5}; Arrays.sort(arry);//对数组进行自动排序 for(int i:arry) System.out.print(i); List<String> li = new ArrayList<String>(); li.add("a"); li.add("d"); li.add("b"); li.add("f"); li.add("c"); li.add("e"); Collections.sort(li);//对对象列表进行排序 for(String s:li) System.out.print(s); }

实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器

要使一个对象可以放到有序映射或有序集合,进行自然排序则要:

1、实现Compareble<T>接

2、重写comparaTo方法

    int compareTo(T o)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
public class Student implements Comparable<Student>{  //1 private String name; private int age; public Student() { super(); } public Student(String name, int age) { super(); this.setAge(age); this.setName(name); } @Override public boolean equals(Object obj){ if(obj == null) return false; else if(obj instanceof Student){ Student st = (Student)obj; return this.getName().equals(st.getName()); } return false; } @Override public int hashCode(){ int type = 12; return type * 23 + name.hashCode(); } @Override public String toString(){ return this.getName()+":"+this.getAge(); } @Override public int compareTo(Student o) { //2 System.out.println("运行comparato"); // return this.getName().compareTo(o.getName()); return this.getAge() - o.getAge(); }   public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { if(age > 0 && age < 150){ this.age = age; } } } 
接口 Comparator<T>
强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。

public class StudentComparable { public static void main(String[] args) { Set<Student> st = new TreeSet<Student>(new Comparator<Student>() { @Override public int compare(Student s1,Student s2) { return s1.getName().compareTo(s2.getName()); // return s1.getAge()-s2.getAge(); //基本数据类型  } }); for(int i=0;i<10;i++){ Student s = new Student("name"+i,100-i*4); st.add(s); } System.out.println(st); } }

 

 
 
 
 

你可能感兴趣的:(comparator)