2015-04-30 51 views
13

Cha mẹ là lớp được kế thừa bởi Trẻ em. được thừa hưởng bởi GrandChild. Mỗi lớp chứa Danh sách các lớp con (nghĩa là Parent chứa List of Child and Child chứa List of GrandChild). Mỗi lớp chứa 50 thuộc tính (attrib1-atrib50). getChildList() trả về ArrayList của các đối tượng của loại getGrandChildList con() trả về ArrayList của các đối tượng của loại cháuSắp xếp bằng cách sử dụng Giao diện so sánh và java 8 luồng

Hãy ResultSet được Danh sách Chánh

List<Parent> resultSet 

Bây giờ tôi muốn sắp xếp danh sách dựa trên một số thuộc tính. Ví dụ nếu tôi muốn sắp xếp ResultSet dựa trên hai thuộc tính cha mẹ (nói Attribute 1 và thuộc tính 2, tôi sử dụng mã này.

Comparator<Parent> byFirst = (e1, e2) -> e2.getAttrib1().compareTo(e1.getAttrib1()); 
    Comparator<Parent> bySecond = (e1, e2) -> e1.getAttrib2().compareTo(e2.getAttrib2()); 

Comparator<Parent> byThird = byFirst.thenComparing(bySecond); 


List<Parent> sortedList = resultSet.stream().sorted(byThird) 
       .collect(Collectors.toList()); 

Bây giờ tôi muốn sắp xếp parentlist dựa trên thuộc tính 1 của lớp trẻ và thuộc tính 1 của lớp GrandChild. Tôi nên sắp xếp điều này như thế nào:

+1

Làm thế nào để bạn sắp xếp một danh sách của 'Parent' bởi thuộc tính của' Child' nếu có nhiều 'Child' trong mỗi 'Parent'? Bạn sẽ sử dụng danh sách con nào trong danh sách để so sánh thuộc tính? – Misha

+0

bởi getChildList() Tôi nhận được quyền truy cập vào Child và tôi sẽ chọn một thuộc tính con. –

+1

Vì vậy, nếu một phụ huynh có 10 trẻ em mà tất cả đều có giá trị khác nhau cho attr1, bạn sẽ sử dụng giá trị nào? – Misha

Trả lời

19

Sử dụng Comparator.comparing để làm cho các trình so sánh này giống như bạn sẽ viết bất kỳ thứ gì bạn muốn sử dụng để trích xuất các giá trị cần so sánh:

Comparator<Parent> byAttr1ofFirstChild = Comparator.comparing(
    parent -> parent.getChildren().get(0).getAttr1() 
); 

Comparator<Parent> byAttr1ofFirstGrandChild = Comparator.comparing(
    parent -> parent.getChildren().get(0).getGrandChildren().get(0).getAttr1() 
); 


List<Parent> sortedList = parents.stream() 
    .sorted(byAttr1ofFirstChild.thenComparing(byAttr1ofFirstGrandChild)) 
    .collect(toList()); 
.210

Comparator.comparing cũng sẽ làm cho các ví dụ trong câu hỏi của bạn nhiều đẹp hơn (sử dụng nhập khẩu tĩnh):

Comparator<Parent> byFirst = comparing(Parent::getAttrib1, reverseOrder()); 
Comparator<Parent> bySecond = comparing(Parent::getAttrib2); 
+0

reverseOrder(): - Tôi không thể indentiy phương pháp này trong IDE của tôi –

+2

It's 'Comparator.reverseOrder()', nhưng nó làm cho mã ngắn gọn hơn để sử dụng nhập khẩu tĩnh – Misha

+1

hoặc bạn có thể làm 'so sánh (Parent :: getAttrib1) .reversed(); '. –

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