Comparable
一个实现了Comparable接口的对象的实例可以被用于和相同对象的不同实例做比较。
它本身需要实现java.lang.Comparable接口。
Comparator
一个实现了Comarator接口的对象能够对比不同的对象。
它不能用于同一个类的不同实例的对比,但是可以用于其他类的实例作比较,必须实现java.util.Compartor。
comparable接口
是一个直接在实例类里实现的接口,实现后就能支持Collections.sort()、TreeSet和TreeMap的排序了,否则不能作为参数输入。
大体的意思就是在实例类里就定义了实例对象的排序方法。
示例:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
class Animal implements Comparable<Animal>{
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Animal o) {
return name.length()-o.getName().length();
}
}
public class SetTest1 {
public static void main(String[] args) {
Set<Animal> set1 = new HashSet<Animal>();
List<Animal> list1 =new ArrayList<Animal>();
addElements(set1);
addElements(list1);
Collections.sort(list1);
showElements(set1);
System.out.println();
showElements(list1);
}
public static void addElements(Collection<Animal> col){
col.add(new Animal("wwwdfg"));
col.add(new Animal("qqqfg"));
col.add(new Animal("yyygfdgdfg"));
col.add(new Animal("eeedfggdfgfgdgdfg"));
}
public static void showElements(Collection<Animal> col){
for(Animal ani :col){
System.out.println(ani.getName());
}
}
}
Comparator接口
是一个在实例类外实现的接口,实现后也能支持Collections.sort()、TreeSet和TreeMap的排序。
它可以在Collections.sort()、TreeSet()和TreeMap()中以匿名内部类的方式实现排序方法。
若它的泛型实例类已经实现了Comparable接口,那也是执行Comparator里的方法而忽略Comparable里的方法。
示例1:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Student implements Comparator<Student>{
private int id;
private String name;
public Student(){
}
public Student(int id,String name){
this.id=id;
this.name=name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "id=" + id + ", name=" + name ;
}
// @Override
// public int compareTo(Student student) {
// if(id>student.id){
// return 1;
// }else if(id<student.id){
// return -1;
// }else{
//
// return 0;
// }
// }
@Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
return o1.id - o2.id;
}
}
public class ListTest1 {
public static void main(String[] args){
// List<String> a =new ArrayList<String>();
// List<String> b =new ArrayList<String>();
//// List<String> c = new ArrayList<>();
List<Student> stus =new ArrayList<Student>();
// a.add("cat");
// a.add("dog");
// a.add("pig");
// a.add("bear");
//
// b.add("fish");
// b.add("graffle");
// b.add("pig");
// b.add("bear");
//// c=a;
// a.retainAll(b);
//
// for(String i:a){
// System.out.println(i);
// }
stus.add(new Student(12, "hehe"));
stus.add(new Student(1,"wei"));
stus.add(new Student(3,"wang"));
stus.add(new Student(5,"wangwei"));
Collections.sort(stus,new Student());
for(Student stu :stus){
System.out.println(stu);
}
System.out.println(stus);
}
}
示例2:
private ArrayList<Employee> list=new ArrayList<Employee>();
public List<Employee> getTop10SalaryEmployees(){
Collections.sort(list,new Comparator<Employee>() {
@Override
public int compare(Employee o1, Employee o2) {
return (int) (o1.getSalary()-o2.getSalary());
}
});
return list.subList(10, 20);
}
网友评论