【问题标题】:Simple Object class and records简单对象类和记录
【发布时间】:2017-05-31 21:17:31
【问题描述】:

我目前正在学习 Java,并且已经完成了几个教程。然而,每个练习都集中在一个部分(例如学习 IO、学习字符串、图形等),但只有少数练习包含多个章节。这意味着我很难制作一个更完整但仍然简单的程序。

请查看我的问题下方。我正在创建一个“汽车类”,在其中创建了 4 个变量。我为用户提供了插入汽车类型、年份和其他两个选项的选项。 设置完所有值后,我们就可以显示它们了。到目前为止(几乎)很好。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class Car {
    String make;
    String model;
    int year;
    String plateNumber; 

    public  Car() {
    }

    // SETS and GETS the type of the Car
    public void setMake (Scanner in) {
        make = in.nextLine();   
    }

    public String getMake () {
        System.out.print("Make: " + make);
        return make;
    }

    // SETS and GETS the model of the Car
    public void setModel (Scanner in) {
        model = in.nextLine();
    }
    public String getModel () {
        System.out.print("Model: " + model);
        return model;
    }

    // SETS and GETS the year of fabrication
    public void setYear(Scanner in) {
        year = in.nextInt();
    }
    public int getYear () {
        System.out.print("Year: " + year);
        return year;
    }

    // SETS and GETS the plateNumber;
    public void setPlate (Scanner in) {
        plateNumber = in.nextLine();
    }
    public String getPlate ()
    {
        System.out.print("License: " + plateNumber);
        return plateNumber;
    }   

    public static void main(String[] args) throws IOException {

        File file = new File("");
        Scanner in = new Scanner(System.in);

        if (!file.exists()) {
            FileWriter writeFile = new FileWriter("cars.txt");
        }

        // CAR 1 ====================
        Car car1 = new Car();
        System.out.println("Car1: ");
        car1.setMake(in);
        car1.getMake();
        car1.setModel(in);
        car1.getModel();        
        car1.setYear(in);
        car1.getYear(); 

        Car [] cars = new Car [5];  // Creates a 5 car array / parking lot

    }

}

在此之后,它应该将数据存储在 [5] Car Array 中,然后将它们保存到外部 txt 文件中。解决以下两点后,我将添加保存到文件。

现在的问题:

  1. 如何使扫描仪和显示更优雅。正如您在下面的打印屏幕中看到的那样,数据翻了一番(打印到屏幕,扫描仪显示汽车类型两次)

  1. 如何将汽车变量存储在一个数组中,然后仅打印模型或仅打印制造年份,或者对于一号汽车,打印这辆车的所有值。 我知道如何制作一个字符串、整数或双精度数组。我只是不知道如何将上述变量存储在 Car 数组中并一一获取 car1 数组值。这让我很困惑。 提前致谢并致以最诚挚的问候,

【问题讨论】:

    标签: java arrays object methods records


    【解决方案1】:
    1. 当您将 getter 更改为不打印值并更改 getter 和 setter 执行的顺序时,您可以实现:

      //other code
      public String getModel () {
          System.out.print("Model: ");
          return model;
      }
      //other code
      public static void main(String[] args) {
          //other code
          System.out.println("Car1: ");
          car1.getMake();
          car1.setMake(in);
          car1.getModel();
          car1.setModel(in);
          car1.getYear();
          car1.setYear(in);
          //other code
      }
      
    2. 当涉及到第二个问题时,您可以像创建任何其他数组一样创建 Car 对象数组并轻松访问数组元素字段:

      public static void main(String[] args) {
          //other code
          Car [] cars = new Main [5];  
          cars[0] = car1;
          System.out.println(cars[0].getMake());
          System.out.println(cars[0].getModel());
      }
      

    【讨论】:

      【解决方案2】:

      创建汽车数组的方式与创建字符串数组相同。

      Car carArray[] = new Car[sizeofarray];
      carArray[i] = car1; 
      

      阅读也是如此:

      for(int i = 0; i < carArray.length; i++){
           carArray[i].getModel(); // do something here
      }
      

      另外,将 Scanner 作为参数传递给 setter 并不是一个好习惯。 Setter 应该采用与字段相同类型的参数。根据您的示例如何代替您这样做:

      car1.setMake(in);
      

      你这样做:

      car1.setMake(in.nextLine());
      

      为了更好的打印,只需先​​打印 pretext,然后等待用户输入,不要重新打印输入。

      【讨论】:

      • 好的,这解决了获取对象数组 .make 或 .year 的问题。非常感谢您的回复!
      【解决方案3】:

      1.您当然可以先输入,然后显示输入的数据。所以,

      car1.setMake(in);
      car1.setModel(in);
      car1.setYear(in);
      car1.getMake();
      car1.getModel(); 
      car1.getYear(); 
      

      并更改setters方法以提示消息输入内容,

      public void setMake (Scanner in) {
          System.out.println("Enter Model : ");
          make = in.next();   
      }
      

      2。在这里,ArrayList 是比数组更好的选择,因为您可能不知道汽车的数量。您可以制作汽车列表并单独调用该方法以获得预期结果。

          ArrayList<Car> carList = new ArrayList<Car>();
          carList.add(car1);
      
          //Call the get(index) method to get the car object and then call the class method you want.
          carList.get(0).getMake();
          carList.get(0).getModel();
      
          //A class always should have a toString() method that returns the string with all the values of class instance.
          System.out.println(carList.get(0).toString());
      

      另外,使用 Car 类的 toString 方法来获取类的所有实例的值。

       @Override
          public String toString() {
              return "Car [make=" + make + ", model=" + model + ", year=" + year + ", plateNumber=" + plateNumber + "]";
          }
      

      【讨论】:

      • 好的,这解决了打印到屏幕加倍的问题。谢谢!
      【解决方案4】:

      您应该使用 Car 类的构造函数来设置模型、年份等。从用户那里获取 Car 信息并保存,然后将其传递给构造函数。

      像这样:

      public  Car( String make, String model, int year) {
           this.make = make;
           //set the values here
          }
      

      在你的主要方法中:

          String make = in.nextLine();
         // You can prompt the user for the car info and then assign the value respectively. Then pass it to the constructor 
      
         Car car1 = new Car(make,model,year);
      

      如果你想创建一个汽车对象的数组,请创建一个while-loop

            Car cars= new Car[5];
             int i=0;
             While(i<5){
           //ask user for input 
          .
          .
          .
          cars[i] = new Car(make,model,year);
         }
      

      【讨论】:

        【解决方案5】:

        使用 System.out.println();用于吸气剂而不是 .print() 使其看起来更好。 要将汽车添加到 cars[],您可以使用 cars[x]=car.x+1;

        【讨论】:

          【解决方案6】:

          这是一个有趣的问题。似乎有许多不同的方法可以解决这个问题。 @NimitPatel 的建议是个好主意。您也可以尝试这样的方法,保持当前设计不变。

          import java.io.File;
          import java.io.FileWriter;
          import java.io.IOException;
          import java.util.Scanner;
          
          public class Car {
              String make;
              String model;
              int year;
              String plateNumber; 
          
              public  Car() {
              }
          
              // SETS and GETS the type of the Car
              public void setMake (Scanner in) {
                  make = in.nextLine();   
              }
          
              public String getMake () {
                  System.out.print("Make: " + make);
                  return make;
              }
          
              // SETS and GETS the model of the Car
              public void setModel (Scanner in) {
                  model = in.nextLine();
              }
              public String getModel () {
                  System.out.print("Model: " + model);
                  return model;
              }
          
              // SETS and GETS the year of fabrication
              public void setYear(Scanner in) {
                  year = in.nextInt();
              }
              public int getYear () {
                  System.out.print("Year: " + year);
                  return year;
              }
          
              // SETS and GETS the plateNumber;
              public void setPlate (Scanner in) {
                  plateNumber = in.nextLine();
              }
              public String getPlate ()
              {
                  System.out.print("License: " + plateNumber);
                  return plateNumber;
              }   
          
              public static void main(String[] args) throws IOException {
          
                  File file = new File("");
                  Scanner in = new Scanner(System.in);
          
                  if (!file.exists()) {
                      FileWriter writeFile = new FileWriter("cars.txt");
                  }
          
                  Car [] cars = new Car [5];  // Creates a 5 car array / parking lot       
          
                  for(int i = 0; i < 5; i++)
                  {
                      Car myCar = new Car();
                      System.out.println("Enter information for Car" + (i + 1) + ":");
                      System.out.println();       
                      System.out.print("Car" + (i + 1) + ": ");
                      myCar.setMake(in);        
                      System.out.print("Model: ");
                      myCar.setModel(in);        
                      System.out.print("Year: ");
                      in.nextLine();           
                      System.out.println();
                      cars[i] = myCar;           
                  }    
              }
          }
          

          如果可以的话,我强烈建议您更改设计。从短期来看,这似乎是不必要的,对于小型项目,很可能是这样,但是如果您打算在以后使用填充了 Car 对象的 cars[] 数组,那么小的重新设计可能会使您的代码更容易阅读。

          一个主要的建议是创建一个独立的Car 类。这个类将只包含关于汽车的逻辑,如何设置关于汽车的信息以及如何从汽车中获取信息。或许,是这样的:

          public class Car 
          {
              private String make;
              private String model;
              private String plateNumber; 
              private int year;    
          
              // Constructor
              public  Car()
              {
              }
          
              // SETS and GETS the type of the Car
              public void setMake (String make) 
              {
                  this.make = make; 
              }
          
              public String getMake ()
              {        
                  return make;
              }
          
              // SETS and GETS the model of the Car
              public void setModel (String model) 
              {
                  this.model = model;
              }
          
              public String getModel ()
              {        
                  return model;
              }
          
              // SETS and GETS the year of fabrication
              public void setYear(int year) 
              {
                  this.year = year;
              }
          
              public int getYear () 
              {        
                  return year;
              }
          
              // SETS and GETS the plateNumber;
              public void setPlateNumber (String plateNumber)
              {
                  this.plateNumber = plateNumber;
              }
          
              public String getPlateNumber ()
              {       
                  return plateNumber;
              }   
          }
          

          然后您的主类将负责从用户那里获取信息,使用该信息来创建新汽车,并将这些汽车放入一个数组或数组列表中。可能是这样的:

          import java.util.Scanner;
          
          public class Main 
          {   
              public static void main(String[] args)
              {
                  String make, model;
                  int year;    
                  Car cars[] = new Car[3];
          
                  // Get information about cars from the user
                  // Use this information to create a car
                  // Store this car in the array
                  for(int i = 0; i < cars.length; i++)
                  {   
                      System.out.println("Enter information for car " + (i + 1));
          
                      make = getMakeFromUser();
                      model = getModelFromUser();
                      year = getYearFromUser();
          
                      Car myCurrentCar = new Car();
                      myCurrentCar.setMake(make);
                      myCurrentCar.setModel(model);
                      myCurrentCar.setYear(year);
          
                      cars[i] = myCurrentCar;              
                      System.out.println();
                  }
          
                  // Display information about cars from the array        
                  for(int i = 0; i < cars.length; i++)
                  {
                      System.out.println("Information about car " + (i + 1));
                      System.out.println("Make: " + cars[i].getMake());
                      System.out.println("Model: " + cars[i].getModel());
                      System.out.println("Year: " + cars[i].getYear());
                      System.out.println();
                  }
              }
          
              static String getMakeFromUser()
              {
                  String make;
                  Scanner in = new Scanner(System.in);        
                  System.out.print("Make: ");
                  make = in.nextLine();
                  return make;
              }
          
              static int getYearFromUser()
              {
                  int year;
                  Scanner in = new Scanner(System.in);        
                  System.out.print("Year: ");
                  year = in.nextInt();
                  in.nextLine();
                  return year;
              }
          
              static String getModelFromUser()
              {
                  String model;
                  Scanner in = new Scanner(System.in);        
                  System.out.print("Model: ");
                  model = in.nextLine();        
                  return model;
              }
          }
          

          这背后的想法与单一职责原则有关。如果您正在为 Cars 编写代码,您是否希望您的 Car 代码知道如何要求用户输入,或者您是否希望您的 Car 代码只知道如何跟踪有关 Cars 的信息。 here 可以找到有关此原理的好视频。希望这不会使事情变得更复杂。祝你好运。

          【讨论】:

            猜你喜欢
            • 2011-12-29
            • 2021-05-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-10-02
            • 2013-08-10
            • 1970-01-01
            • 2018-03-22
            相关资源
            最近更新 更多