如何优化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
相关产品推荐
相关产品推荐

