当前位置: 首页 > 知识库问答 >
问题:

在java中用一个所有者显示数组中的对象

龚俊捷
2023-03-14

我正在编写一个java代码,我应该创建两个类Vehicle和SecondHandVehicle,并创建一个main来测试代码我的代码运行良好,但我想改变printSecondHandVehicles中的一些东西,使它只打印一个所有者的车辆,忘记任何与一个以上所有者有关的东西。车辆类别:

public class Vehicle{
   public String regNo;
   public String make;
   public int yearOfManufacture;
   public double value;
   public Vehicle(String regNo, String make, int yearOfManufacture, double value){
      this.regNo = regNo;
      this.make = make;
      this.yearOfManufacture = yearOfManufacture;
      this.value = value;
   }
   public String getRegNo(){
      return regNo;
   }
   public String getMake(){
      return make;
   }
   public int getYearOfManufacture(){
      return yearOfManufacture;
   }
   public double getValue(){
      return value;
   }
   public void setValue(double value){
      this.value = value;
   }
   public int calculateAge(int currentYear){
      int age;
      age = currentYear - yearOfManufacture;
      return age;
   }
   public String toString(){
      String V = "Register number is " +regNo+ ", make " +make+ ", year of manufacture " +yearOfManufacture+ ", and it costs " +value;
      return V;
   }
  }

第二类手推车:

public class SecondHandVehicle extends Vehicle{
   private int numberOfOwners;
   public SecondHandVehicle(String regNo, String make, int yearOfManufacture, double value, int numberOfOwners){
      super(regNo, make, yearOfManufacture, value);
      this.numberOfOwners = numberOfOwners;
   }
   public int getNumberOfOwners(){
      return numberOfOwners;
   }
   public boolean hasMultipleOwners(){
      if (numberOfOwners > 1)
         return true;
      else
         return false;
   }
   public String toString(){
      String SHV = "Register number is " +regNo+ ", make " +make+ ", year of manufacture " +yearOfManufacture+ ", and it costs " +value+ ", it has " +numberOfOwners+ " owner/s";
      return SHV;
   }
}
import java.util.*;
public class TestVehicle{
   public static void main(String [] args){
      Scanner scnr = new Scanner(System.in);
      String regNo, make;
      int yearOfManufacture, numberOfOwners;
      double value;
      Vehicle V[] = new Vehicle[50];
      SecondHandVehicle SHV[] = new SecondHandVehicle[50];
      int choice = 0;
      int v = 0;
      int s = 0;
      while (choice != 5) {
         System.out.println(
                    " \nWhat do you want to do?\n"
                    + " 1. Add a vehicle to the list V.\n"
                    + " 2. Display the details of all vehicles available in V\n"
                    + " 3. Add a second-hand vehicle to the list SHV.\n"
                    + " 4. Display the details of all second-hand vehicles available in SHV with only one owner.\n"
                    + " 5. Exit the program.");
         choice = scnr.nextInt();
         if(choice == 1){
            System.out.println(" Enter the register number of the Vehicle: ");
            regNo = scnr.next();
            System.out.println(" Enter the make of the Vehicle: ");
            make = scnr.next();
            System.out.println(" Enter the year of manufacture of the Vehicle: ");
            yearOfManufacture = scnr.nextInt();
            System.out.println(" Enter the value of the Vehicle: ");
            value = scnr.nextDouble();
            V[v] = new Vehicle(regNo, make, yearOfManufacture, value);
            v++;
         }
         else if(choice == 2){
            printVehicles(V, 0);
         }
         else if(choice == 3){
            System.out.println(" Enter the register number of the Vehicle: ");
            regNo = scnr.next();
            System.out.println(" Enter the make of the Vehicle: ");
            make = scnr.next();
            System.out.println(" Enter the year of manufacture of the Vehicle: ");
            yearOfManufacture = scnr.nextInt();
            System.out.println(" Enter the value of the Vehicle: ");
            value = scnr.nextDouble();
            System.out.println(" Enter the number of owners: ");
            numberOfOwners = scnr.nextInt();
            SHV[s] = new SecondHandVehicle(regNo, make, yearOfManufacture, value, numberOfOwners);
            s++;
         }
         else if(choice == 4){
            printSecondHandVehicles(SHV, 0);
         }
         else if(choice == 5){
            System.out.println(" Thank you. ");
         }
         else{
            System.out.println(" Wrong choice... Try again ");
         }
      }
   }
   public static void printVehicles(Vehicle V[], int i){
      if(V == null || i < 0 || i >= V.length){
         return;
      }
      if(V[i] != null){
         System.out.println(V[i].toString());
         }
         printVehicles(V, i+1);
      }   
   public static void printSecondHandVehicles(SecondHandVehicle SHV[], int i){
      if(SHV == null || i < 0 || i >= SHV.length){
         return;
      }
      if(SHV[i] != null){
      System.out.println(SHV[i].toString());
      }
      printSecondHandVehicles(SHV, i+1);
   }
}

共有1个答案

朱渝
2023-03-14

要完成所需的工作,可以结合使用ifgetNumberOfOwners来打印SecondHandVehicle,如果它只有1个所有者。我还建议重写该方法,在中使用而不是递归,因为它可以更直接地转换为所需的行为。您的意图是遍历整个数组。用于(int i=0;i 。您还可以使用 for(SecondHandVehicle shv:shv),以便更简洁,也更具体地表示您的意图。看到 forint索引的程序员不能立即假定您正在使用它来迭代整个值集合。他必须观察循环中的逻辑才能理解这一点。相反,for each语法允许阅读代码的人立即知道该循环的内容处理集合中的每个值(除非您在集合中有提前退出for循环的逻辑)。

有些人认为null是Java中的一个错误,因此我还建议删除所有null检查,而依赖于objects.requirenonnull(T obj)。如果这样做,如果程序中弹出一个鬼鬼祟祟的null,程序将很快失败并出现异常。这对您的代码也有很好的影响,可以更快地理解它,因为它的读者不必在脑海中解析每个对象!=null。业内人士将这样的做法称为“净码”。它是自编文件的代码,简洁,易于理解。由于诸如ifforwhileswitch之类的原因而缩进的大量代码块往往更难理解,尤其是在存在嵌套缩进的情况下。

由于vehicle v[]=new vehicle[50];null,我建议使用ArrayList,它在添加元素时自动增长,而不需要额外的null值。它看起来类似于shv.add(shv);,您可以使用shv.get(i)获取i的the元素(使用从零开始的索引)。您可以使用shv.isempty()shv.size()来控制诸如遍历列表之类的事情。这里使用列表还有两个额外的好处。首先,您可以容纳超过50个secondhandvehicle对象,而无需额外的工作或代码复杂性(非常干净的代码!);其次,您不需要保留一个变量来记住下一个附加值应该使用集合的哪一部分。

如果没有打印secondhandvehicle,您可能还想打印一些内容,因为如果有人点击程序中的某个选项,什么也没有发生,这可能会非常奇怪,然后返回到选择什么选项的问题。可以这样做,即:bool hasPrinted=false;,然后,如果有东西打印,则将hasPrinted更改为true。然后,在print方法的末尾,您可以说类似if(!hasprinted){...}这样的话,“没有一个车主要打印的二手车辆”。

另外一个技巧是使用没有缩写的完整单词,因为它们更清楚,简短的名称不再对程序员有帮助。以前,人们可能没有自动为您完成变量名的IDE,但今天,您可以键入前缀并按enter来确认更大的变量名。例如,scannerscnr=new Scanner(system.in);可以使用名称Scanner,尽管这并不是一个特别容易混淆的缩写。另一方面,字符串regno对我来说并不是很明显。我的第一个猜测是,它代表“reg”(我甚至不能预测它的含义)和“number”。当然,看看你的代码,我可以看到它代表注册号。但为什么不在我深入到你的程序中的逻辑之前先传达它的意思呢?RegistrationNumber甚至VehicleRegistrationNumber都清楚得多。在公司编程中,一个常见的概念是编程时,就像某人在凌晨4:13被叫醒,调试一些无法保持系统在线的东西一样。其思想是编写尽可能干净的代码。有趣的是,有时候这个调试器可能就是你!人们在编写代码和解决问题时都沉浸在自己的头脑中,感觉好像一切都很有逻辑意义,很容易理解。然而,几周后,如果你在半夜被吵醒,你编写的令人困惑的代码也会让你感到困惑。人们在交付早期结果后开始深入考虑其他编码挑战后,往往会忘记他们非常熟悉的复杂逻辑。我的一个同事曾经对代码说过,就像一个斧头杀人犯会在半夜调试你的代码一样。

 类似资料:
  • 我试图显示一个对象中的所有值,但它给了我“必须声明”错误。 我尝试了下面的代码,但仍然出现相同的错误。 而我的对象是: 错误: 错误报告-ORA-06550:第5行,第38列:PLS-00302:组件'ID'必须声明ORA-06550:第5行,第7列:PL/SQL:语句忽略ORA-06550:第6行,第38列:PLS-00302:组件'G'必须声明ORA-06550:第6行,第7列:PL/SQL:

  • 我使用的是sequelize ORM,而对于DB我使用的是MySQL,在其中我关联了两个表并获得了数据,但我希望第二个数据(另一个表的数据)不应该像嵌套对象一样进来,而是我们可以在一个对象中显示所有数据(两个表的数据)。 让我展示一下屏幕快照。 我想要的东西。 忽略数据的键和值,但我的问题是,我们是否可以在同一对象中显示另一个表的数据(像inner join一样),而不是像嵌套对象中的数据。 任何

  • 我在下面代码中复制了一个奇怪问题。我已经在模拟器和设备上进行了测试&结果是一样的。我在一个容器中有26个按钮(它的布局是flowlayout),它本身在BorderLayout(窗体的布局)的南部。但只看到按钮的一部分。我在下面的代码中做错了什么?重新验证也不做任何事情。 这里只看到7个BTN。skipButton也不在那里。为什么其他按钮不显示?

  • 我在与Hawtio相同的JVM中部署了10个Camel组件。 每一个都是唯一的,有不同的ID。 我可以通过JMX视图看到所有10个,但通过“骆驼”视图只能看到9个。

  • 问题内容: 嗨,我在下面的表格中记录了活动和分数 我需要从活动中返回所有记录 退货 然后我需要基于来自点表的用户ID对用户点求和 退货 一切都很好,但我需要将它们放在一起给用户,即 有指针吗? 问题答案: 使用外部联接: 或子查询: