2017-03-31 46 views
0

如何在一個比較方法(比較器1)和(比較器2)中組合以下比較方法?通過多個字段比較對象,如何在一個方法中添加?

'''

private List<Bonus> getBonusListSortedByHasAccountAndDate(List<Bonus> bonusList) { 

    final Comparator<Bonus> comparator1 = new Comparator<Bonus>() { 
     public int compare(Bonus o1, Bonus o2) { 
      return Boolean.compare(o1.isActive(), o2.isActive()); 
     } 
    }; 

    bonusList.sort(comparator1); 
    List bonusList2 = bonusList; 

    final Comparator<Bonus> comparator2 = new Comparator<Bonus>() { 
     public int compare(Bonus o1, Bonus o2) { 
      return o1.getDate().compareTo(o2.getDate()); 
     } 
    }; 
    bonusList2.sort(comparator2); 
    return bonusList2; 
} 


@Test 
public void test() { 
    List<Bonus> bonus = createBonus(); 
    List<Bonus> getBonusListSortedByHasAccountAndDate = getBonusDTOListSortedByHasAccount2(bonus); 
    assertThat(getBonusListSortedByHasAccountAndDate.get(0).getName(), is("2")); 
    assertThat(getBonusListSortedByHasAccountAndDate.get(1).getName(), is("3")); 
    assertThat(getBonusListSortedByHasAccountAndDate.get(2).getName(), is("1")); 
} 

更新:我比較和排序我想要「創造最古老的紅利」和「獎金應被激活」

提前很多感謝。 zoram

回答

1

您可以使用Java 8個流API:

bonusList.stream() 
     .sorted(comparing(Bonus::getDate).thenComparing(Bonus::isActive)) 
     .collect(toList()); 

您將需要以下進口:

import static java.util.Comparator.comparing; 
import static java.util.stream.Collectors.toList; 

此外,在問候你的測試,我會建議使用一些工具在單個語句中進行斷言併爲您提供更好的診斷。看看Shazamcrest

1

如何: -

final Comparator<Bonus> comparator = new Comparator<Bonus>() { 
    public int compare(Bonus o1, Bonus o2) { 
     if (Boolean.compare(o1.isActive(), o2.isActive()) == 0) { 
      return o1.getDate().compareTo(o2.getDate()); 
     } else { 
      return Boolean.compare(o1.isActive(), o2.isActive()); 
     } 
    } 
}; 

我假設isActive()優先getDate()

(感謝@Jaroslaw Pawlak指出n00b錯誤)。

+0

糟糕!謝謝,修復。 –

+0

這種在Java中是一種穩定的算法,這意味着如果兩個對象被認爲是相等的,它們將不會被重新排序。因此,結果將首先按日期排序,然後按主動(僅在日期相等的情況下才有效)。所以在你的比較器中,你應該首先比較日期,如果它們相等,則比較活動。當然,這一切都取決於OP實際需要的內容 - 只是說你的代碼與OP發佈的內容不一樣:) –

+0

確實如此,但直到我們知道OP實際需要的內容,它才值得編輯。 –

相關問題