【问题标题】:How to edit instance variable in method and read in different method如何在方法中编辑实例变量并以不同的方法读取
【发布时间】:2022-01-05 06:49:58
【问题描述】:

我对 java 还很陌生,找不到特别能回答我问题的问题。

我将一个数组列表初始化为实例变量,并且在一种方法中我编辑了这个也有效的数组列表,但是我无法将此值存储在实例变量中,然后用另一种方法读取它,因为它再次显示为空。我尝试使用 getter 和 setter,但这并没有真正起作用,即使我认为这是解决方案的一部分......

这是我的代码的一些相关的sn-ps:

public class CarManager {

ArrayList<Car> carList = new ArrayList<>();
        String carId ="";
        String driver= "";
        int sizeCategory= 0;
        Car myCar= new Car (carId,driver,sizeCategory);`


public void addCar () {
    CarManager myCarManager= new CarManager();

Car car1 = new Car(carId,driver,sizeCategory);
         carId= car1.getCarId(carId);
        driver= car1.getDriver (driver);
        sizeCategory= car1.getSizeCategory (sizeCategory);
        
        System.out.println("You entered the following data:");
        System.out.println("\ncar ID: "+ carId);
        System.out.println("driver's name:" +driver);
        System.out.println("size category: "+sizeCategory);
    System.out.println("\nIf you are okay with this, press 0 to save the data and return to the CARS MENU");
    System.out.println("\nIf you made a mistake, press 1 to enter the data again");
    Scanner afterAddCar= new Scanner(System.in);
    String choice1;
    choice1= afterAddCar.next().trim();
    
    if ("1".equals (choice1)) {
        myCarManager.addCar();
    }
    
    if ("0".equals (choice1)) {
        
         
         
        Car returnedCar= new Car (carId,driver,sizeCategory);
         
         carList.add(returnedCar);
         String list = carList.toString();
        System.out.println(list);
        myCarManager.setCarList(carList);
        ArrayList<Car> afterAdd= carList;
         myCarManager.handleCars();
                  
    }
}

public ArrayList<Car> getCarList() {
    return carList;
}

public void setCarList(ArrayList<Car> carList) {
   this.carList = carList;
}

public void listCars () {
    
 
     String list = carList.toString();
System.out.println(list);

}

我还有第二节课叫做 Car,为了更好地理解,我也会在这里发布:

public class Car {


private String carId;
private String driver;
private int sizeCategory; // value from 1-3 indicating the size of the car

public Car () {}

public Car (String carId,String driver,int sizeCategory){
    this.carId= carId;
    this.driver= driver;
    this.sizeCategory= sizeCategory;
}


    public String getCarId(String carId) {
    Scanner keyboard = new Scanner(System.in);
    System.out.println("\nFirst enter the car ID: " + carId);
    
    
    while (carId.length() < 6) {  
        System.out.println("Please enter an ID that has at least 6 characters");
        
        carId = keyboard.next(); 
        
    }
    return carId;
    
    }

public void setCarId(String carId) {
    this.carId = carId;
}


    
    public String getDriver(String driver) {
    Scanner keyboard = new Scanner(System.in);
    System.out.println("\nNext enter the driver's name:" + driver);
    
    driver= driver.trim();
    while (driver.length() < 2) {  
        System.out.println("Please enter a name that has at least 2 characters");
        
        driver = keyboard.next(); 
        driver= driver.trim();
    }
    return driver;
}
    


public void setDriver(String driver) {
    this.driver = driver;
}

    
     public int getSizeCategory(int sizeCategory) {
    Scanner keyboard = new Scanner(System.in);
    String input="";
    System.out.println("\nNow the size category: ");
    
    while (sizeCategory <1 || sizeCategory >3) {  
        System.out.println("The size category has to be between one and three");
        
        input = keyboard.next().trim(); 
        try {
            sizeCategory = Integer.parseInt(input);
        } catch (Exception e) {
            sizeCategory = 0;
        }
    }
    return sizeCategory;
}
   

public void setSizeCategory(int sizeCategory) {
    this.sizeCategory = sizeCategory;
}

现在我知道这里可能有不止一件事可以改进,但我最感兴趣的是通过列出更新后的数组列表来解决问题。

提前非常感谢!

【问题讨论】:

    标签: java arraylist instance-variables


    【解决方案1】:

    您的问题似乎是您每次都在创建new CarManager,并使用递归进入您在addCar() 方法中创建的新CarManager。在我看来,您只需要一个CarManager,所有Car 实例都会添加到您的ArrayList&lt;Car&gt;,这是您Car Manager 中的一个字段。

    我假设这是因为您的 Car 类有字段:

    private String carId;
    private String driver;
    private int sizeCategory;
    

    在您的CarManager 中重复相同的字段基本上没有用。

    我建议使用 while 循环来检查用户输入,例如:

    public void addCar(Scanner scanner) { // passing on the scanner
       while (true) {
            // ask the user for inputs
            String carId = scanner.nextLine();
            String driver = scanner.nextLine();
            int sizeCatagory = Integer.parseInt(scanner.nextLine());
             // ask user for confirmation
            if (scanner.nextLine().equals("1") {
                continue; 
            } else {
                carList.add(new Car(carId,driver,sizeCategory));
                break;
            }
        }
    
    }
    

    【讨论】:

    • 非常感谢您的回答!我现在如何继续?随着中断,程序将结束,但我需要能够稍后列出汽车并更新/编辑数组列表。我尝试了 CarManager.handleCars() ,然后列出了数组列表,但这不起作用。
    • break 不退出方法,它只退出while looploop 仅用于查看用户是否对inputs 满意或想再次重复它们。在break 退出循环后,该方法仍会继续执行您在循环后放置的其他函数。如果我们在另一方面使用return 而不是break 现在将退出整个方法。
    • 再次感谢您抽出宝贵的时间,并为我不准确的语言感到抱歉。我并不是说中断会结束整个程序,而是在那次中断之后我需要一些东西。我的问题可以更好地表述为:如何在不创建新 CarManager 的情况下从此类中的另一个方法(listCars)访问刚刚创建的数组列表 Car
    • 您确实需要创建一个CarManager,但只在您的主目录中创建一次,这个CarManager 将拥有您添加给他的所有汽车,因为他持有您添加的汽车的列表. CarManager 有 2 种方法,一种将打印所有汽车,另一种将 return 发送给您所有汽车的listCarManager manager = new CarManager(); manager.addCar(scanner); 重复直到你添加所有你想要的汽车,把你的扫描仪传递给方法。 manager.listCar(); 打印经理拥有的所有汽车或manager.getCarList(); 如果您希望列表对其进行处理。
    • 澄清一下,如果您愿意,您可以创建多个CarManagers,例如CarManager secondManager = new CarManager();,它将包含与第一个经理分开的不同汽车集的列表。
    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多