Java自定义酒店列表排序实现的性能优化咨询
问题描述
我有一个Hotel模型,结构如下:
Hotel name bookings reviews
需求是:将酒店列表按预订量(bookings)降序排序后,让列表的第三个元素为剩余元素中评论数(reviews)最多的,其余元素仍保持预订量排序的顺序。
我已经实现了可行方案,步骤如下:
- 基于预订量创建默认比较器对列表进行排序
- 若列表长度小于3则不做处理
- 若列表长度大于等于3,将列表拆分为前2个元素和从第3个开始的剩余元素两个子列表
- 创建新列表,先加入前2个元素的子列表
- 在剩余子列表中找到评论数最多的酒店,将其加入新列表并从剩余子列表中移除
- 最后将剩余子列表(已移除评论最多项)加入新列表
当前可正常运行的代码:
public class HotelSort { public static void main(String args[]){ List<Hotel> hotels = new ArrayList<>(); hotels.add(new Hotel("A", 2, 50)); hotels.add(new Hotel("B", 4, 30)); hotels.add(new Hotel("C", 1, 60)); hotels.add(new Hotel("D", 8, 10)); hotels.sort(Comparator.comparing(Hotel::getNumberOfBookings).reversed()); if(hotels.size() < 3){ System.out.println(hotels); } else { var customSortedList = new ArrayList<>(hotels.subList(0, 2)); var secondList = new ArrayList<>(hotels.subList(2, hotels.size())); var mostReviewedHotel = secondList.stream().max(Comparator.comparing(Hotel::getNumberOfReviews)).orElseThrow(); secondList.remove(mostReviewedHotel); customSortedList.add(mostReviewedHotel); customSortedList.addAll(secondList); System.out.println(customSortedList); } } }
当前输出符合预期,但想了解是否存在性能更高效的实现方式?
优化方案与性能分析
你的现有方案逻辑清晰,已经满足需求,但可以从减少集合复制、避免流操作的额外开销这两个点来优化性能,尤其是当酒店列表规模较大时,优化效果会更明显。
优化思路
- 不拆分原排序后的列表,直接在原列表上找到剩余元素中评论最多的项,通过一次移除+插入操作完成位置调整,避免创建多个子列表的开销。
- 手动遍历找评论最多的元素,替代流操作的额外封装开销(流在小数据量下差异不大,但大数据量下手动遍历更高效)。
优化后的代码
public class HotelSort { public static void main(String args[]) { List<Hotel> hotels = new ArrayList<>(); hotels.add(new Hotel("A", 2, 50)); hotels.add(new Hotel("B", 4, 30)); hotels.add(new Hotel("C", 1, 60)); hotels.add(new Hotel("D", 8, 10)); // 第一步:按预订量降序排序 hotels.sort(Comparator.comparing(Hotel::getNumberOfBookings).reversed()); if (hotels.size() >= 3) { // 从索引2开始遍历,找到评论数最多的元素的位置 int maxReviewIndex = 2; for (int i = 3; i < hotels.size(); i++) { if (hotels.get(i).getNumberOfReviews() > hotels.get(maxReviewIndex).getNumberOfReviews()) { maxReviewIndex = i; } } // 将评论最多的元素移动到索引2的位置 Hotel mostReviewed = hotels.remove(maxReviewIndex); hotels.add(2, mostReviewed); } System.out.println(hotels); } }
性能提升点
- 减少集合复制:原方案创建了
customSortedList和secondList两个新集合,优化后直接在原排序后的列表上操作,省去了集合复制的时间和内存开销。 - 避免流的额外开销:手动遍历找最大评论数的元素,比
stream().max()少了流的封装、迭代器创建等额外操作,在数据量较大时更高效。 - 操作更简洁:仅通过
remove+add两个操作完成位置调整,逻辑更紧凑。
边界情况说明
- 当列表长度小于3时,直接保持原排序结果,和原方案一致。
- 当剩余元素中有多个评论数相同的最大值时,会选择最早出现的那个(和原方案中
stream().max()的行为一致,因为max返回的是遇到的第一个最大值)。
内容的提问来源于stack exchange,提问作者Sandeep Nair
相关产品推荐
相关产品推荐

