2011-08-19 19 views
6

Jeśli mam następujące klasy:Jak poprawnie używać korektora 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 
} 

Jak mogę użyć komparatora, który porównuje z nazwy, a następnie z wiekiem, a następnie id?

+2

Dla tych downvoting, proszę o pomoc, mówiąc, dlaczego/jak kwestia zasługuje na downvote do ciebie. –

+0

Nie można przesłonić metody ".equals()", która porównuje wszystkie trzy wartości? ... Oy, przepraszam, uświadomiłem sobie trochę później, że możesz chcieć posortować obiekty, a tym samym komparator! – Sap

Odpowiedz

8

Należy go zaimplementować w taki sposób, aby składał zamówienia według preferowanych elementów. Oznacza to, że trzeba porównać z nazwy, a następnie, jeśli to porównanie jest równa, porównać ze względu na wiek, itd. Przykładem są wymienione poniżej:

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

Ktokolwiek zrobił anonimowy głos, czy mógłbyś doradzić, w jaki sposób mogę poprawić moją odpowiedź, a przynajmniej co jest z nią nie tak? Dzięki. – Bringer128

4

Aktualizacja

natknąłem się na to przed chwilą: How to compare objects by multiple fields Jedną z odpowiedzi związanych ComparatorChain który wywoła wiele komparatorów kolejno aż niezerową wyniku jest odbierany z komparatora lub wszystkie komparatory są wywoływane. To prawdopodobnie powinno być Twoim preferowanym rozwiązaniem.


Może to (niesprawdzone) realizacja Comparator#compare() rade.

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 za wyszukiwanie starych pytań. (I odpowiedź jakościowa) – Bringer128

1

Można również wdrożyć porównywalnym interfejsem w swojej klasie.

na przykład coś takiego:

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

więc nie trzeba zaimplementować przenna porównać pracowników.

1

wdrożyć go

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

Zastosowanie:

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

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

Czytaj Sorting an ArrayList of Contacts, to trzeba pomóc, a dostaniesz kolejne pomysły i różne różne rodzaje wykorzystania porównawczej.

1

guawa 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

Użyj tego:

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 + "]"; 
    } 
} 
Powiązane problemy