通过多个字段比较对象,如何在一个方法中添加?

时间:2017-03-31 15:19:45

标签: java compare

如何在一个比较方法(比较器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

2 个答案:

答案 0 :(得分:1)

您可以使用Java 8 stream 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 :(得分: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错误)。