【发布时间】:2017-12-02 09:46:09
【问题描述】:
我正在寻找一种方法来实现比较器,以便按名称和价格比较产品。我在这里找到了很多有用的信息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
【问题讨论】:
-
输出应该是什么?你分享的输出是逻辑,我看不出问题出在哪里
-
但是输出是按名称和价格排序的!按价格排序仅适用于同名产品。
-
我希望名称按字母顺序排列,价格按升序排列。
-
如果您按两个字段排序,则仅在第一个字段相等时才查看第二个字段(即第一个比较产生 0)。您的输入绝不是这种情况,因为您首先按名称排序,并且所有名称都不同
-
显示预期输出并解释它与当前输出的区别。
标签: java lambda collections java-stream