2012-02-06 29 views
9

Dowiedziałem się o interfejsie Comparable, dla którego klasa musi implementować metodę compareTo. Projekt Używam tej metody jak:Co dokładnie robi program org.apache.commons.lang.builder.CompareToBuilder?

public class EmployeeAssignmentTotal implements Comparable<EmployeeAssignmentTotal>, Serializable { 

private Employee employee; 
private int total; 
.... 
public int compareTo(EmployeeAssignmentTotal other) { 
    return new CompareToBuilder() 
      .append(employee, other.employee) 
      .append(total, other.total) 
      .toComparison(); 
} 

Co exacly ma CompareToBuilder zrobić tutaj? A jak się wchodzi w interakcję z atrybutami employee i total?


Czytałem the javadocs, ale nie mogę zrobić głowę lub ogon, co robią z konstruktora i wielu append ów. Czy to pytanie wskazuje na niejasne intencje i zero badań?

+3

Czy Javadoc (http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/CompareToBuilder.html) jest w jakiś sposób niejasny? – skaffman

+2

Jest niejasny na wiele sposobów. W szczególności, w jaki sposób obliczana jest wynikowa liczba całkowita lub w jaki sposób sekwencja dodatków wpływa na wartość zwracaną. –

+2

Znalazłem ten bardzo pouczający post - http://www.codejava.net/java-core/collections/sorting-a-list-by-multiple-attributes-example – Shatu

Odpowiedz

4

Ta klasa ma pomóc w budowaniu compareTo() -metod. Wyobraź sobie, że masz więcej niż 2 pola w swojej klasie - ręczne kodowanie twojej metody porównania może być dość kłopotliwe.

CompareToBuilder robi to za ciebie - każda metoda append() dodaje nowe porównanie, a wszystkie porównania to && ed.

W związku z tym opublikowany przez Ciebie kod działa equals() na obiekcie pracownika i total.

10

Próbowałem dowiedzieć się, jak działa CompareToBuilder i natknąłem się na ten post, ale nie byłem zadowolony z odpowiedzi. Na przykład metoda toComparison powinna zwracać ujemną liczbę całkowitą, dodatnią liczbę całkowitą lub zero, ponieważ budowniczy ocenił stronę "lewą" jako mniejszą niż, większą lub równą stronie "prawa ręka".

Moje pytanie brzmiało, w jaki sposób kolejność dołączanych atrybutów wpływa na porównanie. Aby odpowiedzieć na to pytanie, jedyne co mogę zrobić, to sprawdzić kod źródłowy i znalazłem to:

public CompareToBuilder append(int lhs, int rhs) { 
    if (this.comparison != 0) { 
     return this; 
    } 
    this.comparison = ((lhs > rhs) ? 1 : (lhs < rhs) ? -1 : 0); 
    return this; 
} 

Tak, w zasadzie to, co się dzieje, jest to, że będzie to porównać atrybutów na podstawie kolejności ich dopisywania. W przykładzie kodu "pracownik" zostanie najpierw oceniony. Jeśli atrybuty po lewej stronie są oceniane jako mniejsze lub większe niż po prawej stronie, suma jest pomijana.

Atrybut "ogółem" będzie oceniany tylko wtedy, gdy "pracownik" oceni się jako równy.

Powiązane problemy