如何按Room类的price属性对Java的Hotel对象列表排序?
按Room的price属性排序Hotel列表的解决方案
嗨,这个需求很常见!不过得先明确一点:一个酒店可能有多个可用房间,你是想按房间的最低价格、最高价格还是平均价格来排序酒店呢?我给你列几种常见的实现方式,你可以根据实际需求选择。
首先,假设你的Room类有一个getPrice()方法来获取价格(毕竟你提到了price属性,我默认它有对应的getter):
public class Room { private double price; // 构造器、其他属性... public double getPrice() { return price; } }
接下来分情况给出代码:
1. 按酒店可用房间的最低价格排序
这种情况会把拥有最便宜房间的酒店排在前面,如果酒店没有可用房间,我们可以默认给一个极高的价格让它排到最后(或者你可以根据需求调整默认值):
// 使用Collections.sort()直接修改原列表 Collections.sort(hotelList, Comparator.comparingDouble(hotel -> hotel.getAvailableRooms().stream() .mapToDouble(Room::getPrice) .min() .orElse(Double.MAX_VALUE) // 无可用房间时默认最大值,排到最后 )); // 或者用Stream API生成新的排序后的列表(不修改原列表) List<Hotel> sortedByLowestPrice = hotelList.stream() .sorted(Comparator.comparingDouble(hotel -> hotel.getAvailableRooms().stream() .mapToDouble(Room::getPrice) .min() .orElse(Double.MAX_VALUE) )) .collect(Collectors.toList());
2. 按酒店可用房间的最高价格排序
逻辑和上面类似,只是把min()换成max():
Collections.sort(hotelList, Comparator.comparingDouble(hotel -> hotel.getAvailableRooms().stream() .mapToDouble(Room::getPrice) .max() .orElse(Double.MIN_VALUE) // 无可用房间时默认最小值,排到最前 ));
3. 按酒店可用房间的平均价格排序
如果需要按平均价格排序,可以这样实现:
Collections.sort(hotelList, Comparator.comparingDouble(hotel -> hotel.getAvailableRooms().stream() .mapToDouble(Room::getPrice) .average() .orElse(Double.MAX_VALUE) // 无可用房间时默认最大值,排到最后 ));
额外提示
- 如果你的排序需要倒序,只需要在
Comparator后面加上.reversed()即可,比如:Collections.sort(hotelList, Comparator.comparingDouble(...).reversed()); - 记得处理
getAvailableRooms()返回null的情况!如果有可能返回null,可以在流操作前加个判断,比如:(hotel.getAvailableRooms() == null ? Stream.empty() : hotel.getAvailableRooms().stream()) .mapToDouble(Room::getPrice) .min() .orElse(Double.MAX_VALUE)
内容的提问来源于stack exchange,提问作者Vlad Dănilă
相关产品推荐
相关产品推荐

