我一直在寻找一种方法来实现比较器,以便按名称和价格比较产品。我在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 :(得分:1)
当你在前一个比较器之上组成具有thenComparing
的比较器时,只有当前一个比较器通过给定的排序键找到至少两个相等的元素时,才会考虑它。
查看您的输出,没有相同名称的产品,因此根本不考虑价格。
考虑到你已经提到过:
我希望按字母顺序排列名称和价格 升序。
简单的事实是,不能完成而不会丢失产品名称的排序或奖品的排序。
您可以做的最好的事情是在适当时按名称或奖品对产品进行分类。