使用Comparator进行两个Object的比较
定义一个Person类:public class Person{private String name;private double salary;private String dept;public String getName() {return name;}public void setName(String name) {this.name = name;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public String getDept() {return dept;}public void setDept(String dept) {this.dept = dept;}public Person() {}public Person(String name, double salary, String dept) {this.name = name;this.salary = salary;this.dept = dept;}@Overridepublic String toString() {StringBuffer sBuffer = new StringBuffer("");sBuffer.append(this.getName()+","+this.getSalary()+","+this.getDept());return sBuffer.toString();}}
下面是用于比较两个Person的测试方法:import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;
public class MainMethod {@SuppressWarnings("unchecked")public static void main(String[] args) {List<Person> personList = new ArrayList<Person>();personList.add(new Person("老李",5890.78,"管委会"));personList.add(new Person("泽民",10000,"管委会"));personList.add(new Person("呼呼",2000.34,"管委会"));Collections.sort(personList,new Comparator(){public int compare(Object o1, Object o2) {Person p1 = (Person)o1;Person p2 = (Person)o2;return (int)(p2.getSalary() - p1.getSalary())*100;}});Person iterPerson;for (int i = 0; i < personList.size(); i++) {iterPerson = personList.get(i);System.out.println(iterPerson.toString());}}}
加红色字体部分为核心代码,上述的方法适用于Person对象没有实现Comparable接口,则我们会告诉Collections工具类,我们用于比较的比较器。
如果继承了Comparable接口的时候代码如下:下面这个是Person类:public class Person implements Comparable<Person>{private String name;private double salary;private String dept;public String getName() {return name;}public void setName(String name) {this.name = name;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public String getDept() {return dept;}public void setDept(String dept) {this.dept = dept;}public Person() {}public Person(String name, double salary, String dept) {this.name = name;this.salary = salary;this.dept = dept;}@Overridepublic String toString() {StringBuffer sBuffer = new StringBuffer("");sBuffer.append(this.getName()+","+this.getSalary()+","+this.getDept());return sBuffer.toString();} public int compareTo(Person o) { return (int)(o.getSalary()-getSalary())*100; }}下面这个是比较两个Person的测试方法:import java.util.ArrayList;import java.util.Collections;import java.util.List;
public class MainMethod {@SuppressWarnings("unchecked")public static void main(String[] args) {List<Person> personList = new ArrayList<Person>();personList.add(new Person("老刘",5890.78,"管委会"));personList.add(new Person("泽民",10000,"管委会"));personList.add(new Person("呼呼",2000.34,"管委会"));Collections.sort(personList);Person iterPerson;for (int i = 0; i < personList.size(); i++) {iterPerson = personList.get(i);System.out.println(iterPerson.toString());}}}这里面会有另外一个问题,如果我的元素实现了Comparable接口,并且重写了compareTo方法,如果我需要逆序排序该怎么办呢?java已经替你想到了这种情况,可以在传入一个Collections.ReverseOrder()来将比较器逆序,实际就是将参数a b 逆序变成 b a,具体的调用代码如下:import java.util.ArrayList;import java.util.Collections;import java.util.List;
public class MainMethod {@SuppressWarnings("unchecked")public static void main(String[] args) {List<Person> personList = new ArrayList<Person>();personList.add(new Person("老刘",5890.78,"管委会"));personList.add(new Person("泽民",10000,"管委会"));personList.add(new Person("呼呼",2000.34,"管委会"));Collections.sort(personList,Collections.reverseOrder());Person iterPerson;for (int i = 0; i < personList.size(); i++) {iterPerson = personList.get(i);System.out.println(iterPerson.toString());}}}
工作时间长了,对于java里面一些比较基础的东西,反而觉着生疏了。