Java实现:筛选乘客组合以满足运输车辆安全载重余量要求
找出满足安全余量要求的乘客组合
针对需求——从给定乘客体重列表中筛选出能让500磅载重车辆留出恰好300磅安全余量的组合,我整理了对应的Java实现思路,同时也会指出原代码里的问题并给出修正版本:
需求详情
- 车辆最大载重:500磅
- 乘客体重列表:
[130, 170, 140, 100] - 核心目标:找到乘客组合,使得
车辆载重 - 乘客总重量 = 300磅(即乘客总重量为200磅);若目标是匹配组合[130, 170],则对应的安全余量应为500-300=200磅
原代码分析
原代码尝试通过遍历乘客列表寻找符合条件的组合,但存在几个关键问题:
resultList未初始化,调用add()方法时会触发NullPointerException- 循环逻辑仅遍历相邻元素,可能遗漏非相邻的有效组合
- 判断条件与目标组合
[130,170]不匹配(该组合总重量为300磅,对应安全余量应为200磅)
原代码如下:
// Java code public static ArrayList<Integer> weights(int capacity, ArrayList<Integer> passangerweights) { ArrayList<Integer> resultList = null; // 未初始化,会引发空指针异常 int rem_space = 300; List<Integer> passangerList = passangerweights; int[] passangerArray = new int[passangerList.size()]; Integer[] arr = new Integer[passangerList.size()]; arr = passangerList.toArray(arr); // looping through passanger list for (int psg : passangerList) { for (int i = 0; i < arr.length-1; i++) { if (capacity - (arr[i] + arr[i + 1]) == rem_space) { resultList.add(i, arr[i]); // 未初始化的列表调用add会报错 } else { continue; } } } return resultList; }
修正后的代码
下面是修正后的代码,解决了原代码的问题,同时支持根据需求调整目标逻辑:
import java.util.ArrayList; import java.util.List; public class PassengerSelector { public static ArrayList<Integer> findPassengerCombination(int capacity, ArrayList<Integer> passengerWeights) { ArrayList<Integer> resultList = new ArrayList<>(); // 方案1:留出300磅安全余量,乘客总重量 = 500 - 300 = 200磅 int targetTotalWeight = capacity - 300; // 方案2:匹配组合[130,170],乘客总重量为300磅,对应安全余量200磅 // int targetTotalWeight = 300; // 遍历所有两两组合,确保不遗漏有效组合 for (int i = 0; i < passengerWeights.size(); i++) { for (int j = i + 1; j < passengerWeights.size(); j++) { int weight1 = passengerWeights.get(i); int weight2 = passengerWeights.get(j); if (weight1 + weight2 == targetTotalWeight) { resultList.add(weight1); resultList.add(weight2); // 找到一组符合条件的组合后直接返回,若需所有组合可移除此行return return resultList; } } } return resultList; // 未找到符合条件的组合时返回空列表 } // 测试方法 public static void main(String[] args) { ArrayList<Integer> weights = new ArrayList<>(); weights.add(130); weights.add(170); weights.add(140); weights.add(100); ArrayList<Integer> result = findPassengerCombination(500, weights); System.out.println("符合条件的乘客组合:" + result); } }
代码说明
- 提前初始化
resultList,避免空指针异常 - 采用双重循环遍历所有两两组合,而非仅相邻元素,覆盖所有可能的两人组合
- 明确了目标总重量的计算逻辑,可根据实际需求切换方案
- 添加了测试用的
main方法,方便直接验证结果
内容的提问来源于stack exchange,提问作者G.Kumar
相关产品推荐
相关产品推荐

