2011-08-19 76 views
6

如果我有以下类:如何正确使用Java比较器?

public class Employee { 
    private int empId; 
    private String name; 
    private int age; 

    public Employee(int empId, String name, int age) { 
     // set values on attributes 
    } 
    // getters & setters 
} 

如何使用比较,通过名称,然后年龄,然后ID进行比较?

+2

对于那些downvoting,请说为什么/如何的问题值得downvote给你帮助。 –

+0

你可以不重写比较所有三个值的“.equals()”方法吗?...哎呀抱歉,我稍后意识到你可能想要排序对象和比较器! – Sap

回答

8

您需要实施它,以便通过首选元素进行排序。也就是说,你需要通过名称来比较,那么如果比较平等的,年龄比较等的例子如下:

public class EmployeeComparator implements Comparator<Employee> { 

    @Override 
    public int compare(Employee e1, Employee e2) { 
    int nameDiff = e1.getName().compareTo(e2.getName()); 

    if(nameDiff != 0) { 
     return nameDiff; 
    } 

    int ageDiff = e1.getAge() - e2.getAge(); 

    if(ageDiff != 0) { 
     return ageDiff; 
    } 

    int idDiff = e1.getEmpId() - e2.getEmpId(); 

    return idDiff; 
    } 
} 
+3

对于谁做匿名downvote谁,你能告诉我如何能改善我的答案,或者至少有什么问题吗?谢谢。 – Bringer128

4

更新

过这个来到刚才:How to compare objects by multiple fields一个链接到ComparatorChain将调用顺序多比较,直到一个非零结果的答案是从一个比较器的或所有比较被调用。这应该可能是您的首选解决方案。


也许这个(未经测试的)Comparator#compare()的实现将做到这一点。

int compare(Employee e, Employee f) 
{ 
    int val = e.name.compareTo(f.name); 

    if(val == 0) 
    { 
     val = e.age - f.age; 

     if(val == 0) 
     { 
      val = e.empId - f.empId; 
     } 
    } 

    return val; 
} 
+0

+1用于搜索旧问题。 (和一个高质量的答案) – Bringer128

1

您还可以实现在类可比接口。

例如,这样的事情:

public class Employee implements Comparable<Employee>{ 
    private int empId; 
    private String name; 
    private int age; 

    public Employee(int empId, String name, int age) { 
      // set values on attributes 

    } 
    // getters & setters 

    public int compareTo(Employee o) { 
     int ret = this.name.compareTo(o.name); 
     if(ret == 0) 
      ret = this.age - o.age; 
     if(ret == 0) 
      ret = this.empId - o.empId; 

     return ret; 
    } 
} 

,所以你不必实施额外的类来比较你的员工。

1

实现它

public class Employee { 
    private int empId; 
    private String name; 
    private int age; 
    /** 
    * @param empId 
    * @param name 
    * @param age 
    */ 
    public Employee(int empId, String name, int age) { 
     super(); 
     this.empId = empId; 
     this.name = name; 
     this.age = age; 
    } 
    /** 
    * 
    */ 
    public Employee() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 


    public int getEmpId() { 
     return empId; 
    } 
    public void setEmpId(int empId) { 
     this.empId = empId; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public int getAge() { 
     return age; 
    } 
    public void setAge(int age) { 
     this.age = age; 
    } 

    //Compare by name, age and then id 
    public static Comparator<Employee> COMPARE_EMPLOYEE = new Comparator<Employee>() { 
     public int compare(Employee one, Employee other) { 
      //Compare Name 
      if (one.getName().compareToIgnoreCase(other.getName()) == 0) { 
       //Compare age 
       if((one.getAge() - other.getAge()) == 0) { 
        // Now check with id is useless 
        // So directly return result of compare by id 
        return one.getEmpId() - other.getEmpId(); 
       } else { //If age Not equal 
        return one.getAge() - other.getAge(); 
       } 
      } else { //If name not equal 
       return one.getName().compareToIgnoreCase(other.getName()); 
      } 
     } 
    }; 
} 

用途:

List<Employee> contacts = new ArrayList<Employee>(); 
//Fill it. 

//Sort by address. 
Collections.sort(contacts, Employee.COMPARE_EMPLOYEE); 

阅读Sorting an ArrayList of Contacts,这一定帮你,你会得到更多的想法和不同的不同类型的使用比较的。

1

番石榴ComparisonChain

List<Employee> list = new ArrayList<Employee>(); 
    //... 
    Collections.sort(list, new Comparator<Employee>(){  
     @Override 
     public int compare(Employee e1, Employee e2) { 
      return ComparisonChain.start() 
       .compare(e1.empId, e2.empId) 
       .compare(e1.name, e2.name) 
       .compare(e1.age, e2.age).result(); 
    }}); 
0

使用此:

public class Test 
{ 
    public static void main(String[] args) 
    { 
     Employee emp1 = new Employee(2, "Tom", 20); 
     Employee emp2 = new Employee(1, "Tom", 20); 
     Employee emp3 = new Employee(3, "Hank", 21); 

     List<Employee> list = new ArrayList<>(); 

     list.add(emp1); 
     list.add(emp2); 
     list.add(emp3); 

     Collections.sort(list, new Employee().new MyComparator()); 

     System.out.println(list); 
    } 
} 

class Employee 
{ 
    private int empId; 
    private String name; 
    private int age; 

    public Employee() 
    {} 

    public Employee(int empId, String name, int age) 
    { 
     this.empId = empId; 
     this.name = name; 
     this.age = age; 
    } 

    class MyComparator implements Comparator<Employee> 
    { 
     @Override 
     public int compare(Employee e1, Employee e2) 
     { 
      if(e1.name.compareTo(e2.name) == 0) 
      { 
       if(((Integer)e1.age).compareTo(e2.age) == 0) 
       { 
        return ((Integer)e1.empId).compareTo(e2.empId); 
       } 
       else 
       { 
        return ((Integer)e1.age).compareTo(e2.age); 
       } 
      } 
      return e1.name.compareTo(e2.name); 
     } 
    } 

    @Override 
    public String toString() 
    { 
     return "Employee [empId=" + empId + ", name=" + name + ", age=" + age + "]"; 
    } 
}