Java编写汽车数组查询方法时打印对象次数超出预期如何解决
问题背景
当前需要基于Java实现两个递归方法,需求如下:
Search()方法:入参为Car对象数组ARR、Car对象C,若C存在于ARR中返回true,否则返回falsefindCylinders()方法:入参为Car对象数组ARR、气缸数N,输出所有气缸数等于N的Car对象信息
现有代码未使用递归实现,且运行时会重复打印对象,原代码如下:
public class Test_Car_Lab9{ public static void main(String [] args){ Car[] ARR = new Car[50]; for(int i = 0; i < ARR.length; i++){ ARR[i] = new Car(3500, 6, "Mazda", "MX6"); } Car C = new Car(4700, 8, "Nissan", "Patrol"); System.out.println(Search(ARR, C)); findCylinders(ARR, 6); } public static boolean Search(Car[] carsArray, Car carObject){ for(int i = 0; i < carsArray.length; i++){ if(carObject.getMake() == carsArray[i].getMake() && carObject.getModel() == carsArray[i].getModel() && carObject.getCylinders() == carsArray[i].getCylinders() && carObject.getHorsePower() == carsArray[i].getHorsePower()) return true; } return false; } public static void findCylinders(Car[] carsArray, int numOfCylinders){ for(int i = 0; i < carsArray.length; i++){ if(carsArray[i].getCylinders() == numOfCylinders) carsArray[i].printCarData(); } } }
问题排查与解决思路
1. 重复打印问题原因
测试代码中初始化的50个Car对象全部是气缸数为6的Mazda MX6,所以调用findCylinders(ARR,6)会匹配到全部50个对象,自然会打印50次,属于测试数据构造的问题。如果需要去重,可以将匹配到的对象先存入HashSet(需要重写Car类的equals()和hashCode()方法),再统一打印即可。
2. 原有代码隐藏问题
Search方法中比较品牌(make)、型号(model)两个字符串类型属性时用了==,这是引用地址比较,只有两个字符串指向同一个对象时才会返回true,正确写法应该用equals()方法做内容比较。
3. 递归实现两个方法的方案
递归实现的核心是加索引参数标记当前遍历的位置,终止条件为索引超出数组长度:
递归版Search实现
// 对外暴露的公开方法,只需要传数组和目标对象 public static boolean Search(Car[] carsArray, Car carObject) { // 从索引0开始递归遍历 return searchRecursive(carsArray, carObject, 0); } // 内部递归辅助方法 private static boolean searchRecursive(Car[] carsArray, Car carObject, int index) { // 终止条件1:遍历完所有元素都没找到,返回false if (index >= carsArray.length) { return false; } Car current = carsArray[index]; // 终止条件2:当前元素匹配,返回true if (carObject.getMake().equals(current.getMake()) && carObject.getModel().equals(current.getModel()) && carObject.getCylinders() == current.getCylinders() && carObject.getHorsePower() == current.getHorsePower()) { return true; } // 递归判断下一个索引的元素 return searchRecursive(carsArray, carObject, index + 1); }
递归版findCylinders实现
// 对外暴露的公开方法 public static void findCylinders(Car[] carsArray, int numOfCylinders) { // 若需要去重,可以初始化HashSet作为参数传入递归方法,存已经打印过的对象 findCylindersRecursive(carsArray, numOfCylinders, 0); } // 内部递归辅助方法 private static void findCylindersRecursive(Car[] carsArray, int numOfCylinders, int index) { // 终止条件:遍历完所有元素 if (index >= carsArray.length) { return; } Car current = carsArray[index]; if (current.getCylinders() == numOfCylinders) { current.printCarData(); } // 递归处理下一个索引 findCylindersRecursive(carsArray, numOfCylinders, index + 1); }
内容的提问来源于stack exchange,提问作者Gilbert Arenas
相关产品推荐
相关产品推荐

