You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
            }
        }
    }

当前输出符合预期,但想了解是否存在性能更高效的实现方式?


优化方案与性能分析

你的现有方案逻辑清晰,已经满足需求,但可以从减少集合复制、避免流操作的额外开销这两个点来优化性能,尤其是当酒店列表规模较大时,优化效果会更明显。

优化思路

  1. 不拆分原排序后的列表,直接在原列表上找到剩余元素中评论最多的项,通过一次移除+插入操作完成位置调整,避免创建多个子列表的开销。
  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) {
            // 从索引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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:12:21