2012-02-06 24 views
9

Comparableインターフェイスについて学びました。そのクラスでは、compareToメソッドを実装する必要があります。私のように、そのメソッドを使用していたプロジェクト: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(); 
} 

CompareToBuilderはここexacly何をしますか?そしてそれはemployeetotal属性とどのように相互作用していますか?


私はthe javadocsを読みましたが、私は、彼らは、コンストラクタと複数のappend秒で何をしているかの頭や尾を作る傾けます。この質問は、不明な意図とゼロの研究を示していますか?

+3

Javadoc(http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/CompareToBuilder.html)は何らかの点で不明ですか? – skaffman

+2

多くの点で不明です。具体的には、結果のIntegerがどのように計算されるか、または追加シーケンスが返り値にどのように影響するかなどがあります。 –

+2

私はこの非常に有益なポストを見つけました - http://www.codejava.net/java-core/collections/sorting-a-list-by-multiple-attributes-example – Shatu

答えて

4

このクラスは、compareTo()のメソッドの作成を支援するためのものです。クラス内に2つ以上のフィールドがあるとします。手動で比較メソッドをコーディングするのはかなり面倒なことがあります。

CompareToBuilderがこれを行っています - それぞれappend()メソッドが新しい比較を追加しており、すべての比較が&&です。

投稿したコードは、従業員オブジェクトにequals()totalと表示されます。

10

私はCompareToBuilderのしくみを理解しようとしていましたが、私はこの投稿に出会いましたが、私は答えに満足していませんでした。たとえば、toComparisonメソッドは、ビルダーが「左手側」を「右手側」より小さい、大きい、または等しいと判断すると、負の整数、正の整数、またはゼロを返す必要があります。

私の質問は、属性を追加する順番がどのように比較に影響するかということでした。それに答えるために、私は何ができる唯一のことは、ソースコードを確認したと、私はこれを見つけた:

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

だから、基本的に何が起こっていることは、それはあなたがそれらを追加するために基づく属性を比較することです。コード例では、「従業員」が最初に評価されます。左辺の属性が右辺より小さいか大きいと評価された場合、合計は無視されます。

属性「合計」は、「従業員」が等しいと評価された場合にのみ評価されます。

関連する問題