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

如何优化Java中交换列表内rate最值对应Car对象的实现代码

代码优化方案

原代码可优化点

  • 遍历冗余:先后3次遍历列表,可合并为1次遍历获取所有需要的索引,时间复杂度从O(3n)降至O(n),空间复杂度保持O(1)
  • 无边界校验:未处理空列表、长度≤1的列表场景,容易触发索引越界异常
  • 命名不规范:a/b/count等变量无明确含义,可读性差
  • 冗余调试输出:业务代码不需要保留不必要的控制台打印逻辑

优化后实现

import java.util.Collections;
import java.util.List;
import java.util.ArrayList;

class Car {
    private String maker;
    private int rate;

    public Car(String maker, int rate) {
        this.maker = maker;
        this.rate = rate;
    }

    public int getRate() {
        return rate;
    }

    @Override
    public String toString() {
        return "(" + maker + "," + rate + ")";
    }
}

public void processCarList(List<Car> carList) {
    // 边界校验,无需处理的场景直接返回
    if (carList == null || carList.size() < 2) {
        return;
    }

    int minRate = carList.get(0).getRate();
    int maxRate = carList.get(0).getRate();
    int firstMinIdx = 0; // 第一个出现最小rate的索引
    int lastMinIdx = 0; // 最后一个出现最小rate的索引
    int firstMaxIdx = 0; // 第一个出现最大rate的索引
    int lastMaxIdx = 0; // 最后一个出现最大rate的索引

    // 单次遍历拿到所有需要的索引
    for (int i = 0; i < carList.size(); i++) {
        int currentRate = carList.get(i).getRate();
        // 更新最小值相关索引
        if (currentRate < minRate) {
            minRate = currentRate;
            firstMinIdx = i;
            lastMinIdx = i;
        } else if (currentRate == minRate) {
            lastMinIdx = i;
        }
        // 更新最大值相关索引
        if (currentRate > maxRate) {
            maxRate = currentRate;
            firstMaxIdx = i;
            lastMaxIdx = i;
        } else if (currentRate == maxRate) {
            lastMaxIdx = i;
        }
    }

    // 第一次交换,对齐原代码逻辑:交换最后一个最小值和最后一个最大值
    Collections.swap(carList, lastMinIdx, lastMaxIdx);

    // 第二次交换:在原最大值索引之前的区间,交换最后一个最小值和第一个最大值
    int rangeEnd = lastMaxIdx;
    int rangeLastMinIdx = firstMinIdx;
    int rangeFirstMaxIdx = firstMaxIdx;
    for (int i = 0; i < rangeEnd; i++) {
        int currentRate = carList.get(i).getRate();
        if (currentRate == minRate) {
            rangeLastMinIdx = i;
        }
        if (currentRate == maxRate) {
            rangeFirstMaxIdx = i;
            break;
        }
    }
    Collections.swap(carList, rangeLastMinIdx, rangeFirstMaxIdx);
}

效果验证

用你给出的示例数据测试,输出完全符合预期:

public static void main(String[] args) {
    List<Car> cars = new ArrayList<>();
    cars.add(new Car("A", 6));
    cars.add(new Car("B", 2));
    cars.add(new Car("C", 9));
    cars.add(new Car("D", 17));
    cars.add(new Car("E", 8));
    cars.add(new Car("F", 17));
    cars.add(new Car("G", 2));

    processCarList(cars);
    // 输出:(A,6) (D,17) (C,9) (B,2) (E,8) (G,2) (F,17)
    cars.forEach(car -> System.out.print(car + " "));
}

内容的提问来源于stack exchange,提问作者Hoàng Huy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:06:05