Java集合中比较器的使用
如果希望对集合中的对象进行某一属性或多个属性的加权排序,此时就会使用java提供的两个比较接口,分别是Comparable和Comparator。通过一个简单的例子来说明下:
对象Person:
public class Person {
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
1)Comparable接口
需要比较的对象通过实现该接口,重写compareTo方法从对象本质上成为可比较的对象(稍微有点拗口)。如果需要根据比较年龄来对Person排序,此处调用Collections.sort()
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Person person) {
// TODO Auto-generated method stub
//返回值大于0,则当前对象更大,反之,参数对象更大
return this.age-person.age;
}
public static void main(String[] args){
ArrayList<Person> list=new ArrayList<Person>();
list.add(new Person("a",1));
list.add(new Person("b",0));
list.add(new Person("c",3));
list.add(new Person("d",2));
Collections.sort(list);
for(Person p:list){
System.out.print(p.getName()+":"+p.getAge());
}
}
}
由于是在对象基础上添加比较特性,因此需要修改原对象类,实现Comparable接口。
2)Comparator接口
Comparator接口实际上是一个第三方的比较器,不需要改变原有对象类,其类似于sort排序时的裁判。
public class MyComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
// TODO Auto-generated method stub
return o1.getAge()-o2.getAge();
}
}
然后在Collections.sort()中添加比较器作为参数。
public static void main(String[] args){
ArrayList<Person> list=new ArrayList<Person>();
list.add(new Person("a",1));
list.add(new Person("b",0));
list.add(new Person("c",3));
list.add(new Person("d",2));
Collections.sort(list,new MyComparator());
for(Person p:list){
System.out.print(p.getName()+":"+p.getAge());
}
}