期望通过两个字段与比较器进行比较但仅按一个顺序进行比较的方法

时间:2017-12-02 09:46:09

标签: java lambda collections java-stream

我一直在寻找一种方法来实现比较器,以便按名称和价格比较产品。我在How to sort by two fields in Java?找到了很多有用的信息,并实现了我的比较器。

它正确地比较了产品名称,但价格的顺序不正确。 我希望按字母顺序排列名称,价格按升序排列。 怎么可能实现这一目标?我在这里缺少什么?

这是我到目前为止所做的:

按名称和价格进行比较的方法

public static List<BaseProduct> compareNamesAndPrices(List<BaseProduct> baseProducts) {
    Comparator<BaseProduct> productComparator = Comparator.comparing(BaseProduct::getProductName)
            .thenComparing(Comparator.comparing(BaseProduct::getPrice));
    return baseProducts.stream()
            .sorted(productComparator)
            .collect(Collectors.toList());
}

测试方法

List<BaseProduct> sortedProductsList = StaticUtils.compareNamesAndPrices(products);
for (BaseProduct product : sortedProductsList) {
    System.out.println(String.format("Product name: %s  -> Price: %s", product.getProductName(), product.getPrice().toString()));
}

我得到以下输出:

Product name: Bananas  -> Price: 45
Product name: Galaxy 7 phone  -> Price: 400
Product name: Xiaomi Mi5  -> Price: 370

1 个答案:

答案 0 :(得分:1)

当你在前一个比较器之上组成具有thenComparing的比较器时,只有当前一个比较器通过给定的排序键找到至少两个相等的元素时,才会考虑它。

查看您的输出,没有相同名称的产品,因此根本不考虑价格。

考虑到你已经提到过:

  

我希望按字母顺序排列名称和价格   升序。

简单的事实是,不能完成而不会丢失产品名称的排序或奖品的排序。

您可以做的最好的事情是在适当时按名称或奖品对产品进行分类。