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

Java编写汽车数组查询方法时打印对象次数超出预期如何解决

问题背景

当前需要基于Java实现两个递归方法,需求如下:

  • Search()方法:入参为Car对象数组ARR、Car对象C,若C存在于ARR中返回true,否则返回false
  • findCylinders()方法:入参为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:54:00