2012-02-06 35 views
9

Tôi đã học về giao diện Comparable, mà một lớp phải triển khai phương thức compareTo. Dự án tôi đang sử dụng phương pháp đó là:Chính xác thì org.apache.commons.lang.builder.CompareToBuilder làm gì?

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

Điều gì exacly CompareToBuilder làm gì ở đây? Và làm thế nào nó tương tác với các thuộc tính employeetotal?


tôi đã đọc the javadocs, nhưng tôi không thể làm cho người đứng đầu hoặc đuôi của những gì họ đang làm với các nhà xây dựng và nhiều append s. Câu hỏi này cho thấy ý định không rõ ràng và nghiên cứu không?

+3

Javadoc (http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/CompareToBuilder.html) không rõ ràng theo một cách nào đó? – skaffman

+2

Không rõ ràng bằng nhiều cách. Cụ thể là cách tính số nguyên kết quả được tính hoặc cách chuỗi thứ tự gắn thêm ảnh hưởng đến giá trị trả về. –

+2

Tôi tìm thấy bài viết này rất có nhiều thông tin - http://www.codejava.net/java-core/collections/sorting-a-list-by-multiple-attributes-example – Shatu

Trả lời

4

Lớp học này có nghĩa là hỗ trợ bạn trong việc xây dựng compareTo() -methods. Hãy tưởng tượng bạn có nhiều hơn 2 trường trong lớp của bạn - mã hóa thủ công phương pháp so sánh của bạn có thể khá cồng kềnh.

CompareToBuilder đang làm điều đó cho bạn - mỗi phương pháp append() sẽ thêm so sánh mới và tất cả so sánh là && ed.

Vì vậy, mã bạn đã đăng chạy equals() trên đối tượng nhân viên và total.

10

Tôi đã cố gắng tìm hiểu cách CompareToBuilder hoạt động và tôi đã xem qua bài đăng này, nhưng tôi không hài lòng với câu trả lời. Ví dụ, phương thức toComparison sẽ trả về một số nguyên âm, một số nguyên dương, hoặc số không như người xây dựng đã đánh giá "bên trái" bên dưới, lớn hơn hoặc bằng "bên phải".

Vì vậy, câu hỏi của tôi là cách thứ tự các thuộc tính phụ thêm ảnh hưởng đến so sánh. Để trả lời rằng, điều duy nhất tôi có thể làm là kiểm tra mã nguồn và tôi thấy điều này:

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

Vì vậy, về cơ bản những gì đang xảy ra là nó sẽ so sánh các thuộc tính dựa trên thứ tự bạn thêm chúng. Trong ví dụ mã của bạn, "nhân viên" sẽ được đánh giá trước tiên. Nếu các thuộc tính bên trái đánh giá là nhỏ hơn hoặc lớn hơn thì phía bên tay phải, tổng số được bỏ qua.

Thuộc tính "tổng cộng" sẽ chỉ được đánh giá nếu "nhân viên" đánh giá bằng nhau.

Các vấn đề liên quan