2012-02-06 55 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(); 
} 

exacly不CompareToBuilder在这里做什么:我使用的方法,一个项目?它是如何与employeetotal属性进行交互的?


我看过the javadocs,但我不能让他们与构造函数和多append做什么头部或尾部。这个问题是否表明不明确的意图和零研究?

+3

Javadoc(http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/CompareToBuilder.html)在某些方面不清楚吗? – skaffman 2012-02-06 14:15:30

+2

在很多方面还不清楚。特别是如何计算结果Integer或附加序列如何影响返回值。 – 2012-12-07 15:16:33

+2

我发现这个非常翔实的文章 - http://www.codejava.net/java-core/collections/sorting-a-list-by-multiple-attributes-example – Shatu 2014-12-22 14:37:44

回答

4

本课程旨在帮助您构建compareTo()-方法。想象一下,你的班级中不仅有2个字段 - 手动编写你的比较方法可能非常麻烦。

CompareToBuilder正在为您做这件事 - 每个append()方法都增加了一个新的比较,并且所有的比较都是&& ed。

因此,您发布的代码在员工对象上运行equals(),而在total上运行的代码为equals()

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

所以,基本上所发生的事情是,它会根据比较,你追加的顺序上的属性。在您的代码示例中,将首先评估“员工”。如果左侧属性的评估值小于或大于右侧,则总数将被忽略。

仅当“员工”评估等于时,才会评估属性“总计”。