2011-08-19 36 views
6

Nếu tôi có các lớp sau:Làm cách nào để sử dụng trình so sánh Java đúng cách?

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 
} 

Làm thế nào tôi có thể sử dụng so sánh mà so sánh theo tên, sau đó tuổi, sau đó id?

+2

Đối với những downvoting, xin vui lòng giúp đỡ bằng cách nói lý do tại sao/như thế nào câu hỏi xứng đáng một downvote cho bạn. –

+0

Bạn không thể ghi đè lên phương thức ".equals()" so sánh cả ba giá trị? ... Rất tiếc, tôi nhận ra một chút sau đó bạn có thể muốn sắp xếp các đối tượng và do đó so sánh! – Sap

Trả lời

8

Bạn cần triển khai nó để nó đặt hàng theo yếu tố ưu tiên. Nghĩa là, bạn cần phải so sánh theo tên, sau đó nếu so sánh đó là bằng nhau, so sánh theo độ tuổi, vv Một ví dụ được liệt kê dưới đây:

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

Đối với bất cứ ai đã làm downvote ẩn danh, bạn có thể vui lòng tư vấn làm thế nào tôi có thể cải thiện câu trả lời của tôi, hoặc ít nhất là những gì là sai với nó? Cảm ơn. – Bringer128

4

Cập nhật

đi qua này lúc nãy: How to compare objects by multiple fields Một trong những câu trả lời liên quan đến ComparatorChain mà sẽ gọi nhiều bộ so sánh theo thứ tự cho đến khi một khác không kết quả nhận được từ một so sánh hoặc toàn bộ so sánh được gọi. Điều này có lẽ nên là giải pháp ưa thích của bạn.


Có lẽ việc thực hiện (chưa được kiểm tra) này chưa được kiểm tra là Comparator#compare() sẽ thực hiện thủ thuật.

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 để tìm kiếm câu hỏi cũ. (Và một câu trả lời có chất lượng) – Bringer128

1

Bạn cũng có thể thực hiện các giao diện tương đương trong lớp học của bạn.

ví dụ, một cái gì đó như thế này:

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; 
    } 
} 

vì vậy bạn không cần phải thực hiện một lớp học thêm để so sánh nhân viên của bạn.

1

Thực hiện nó

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()); 
      } 
     } 
    }; 
} 

Sử dụng:

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

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

đọc Sorting an ArrayList of Contacts, điều này phải giúp bạn và bạn sẽ nhận được nhiều ý tưởng và các loại khác nhau sử dụng khác nhau của Comparator.

1

ổi 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

Sử dụng này:

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 + "]"; 
    } 
} 
Các vấn đề liên quan