【问题标题】:Create object for each item in an arraylist为数组列表中的每个项目创建对象
【发布时间】:2014-07-24 09:15:05
【问题描述】:

我学习java一个多月了,之前没有OOP经验,所以请提供简单的答案!

我正在进行的项目本质上是一个简单的游戏。我获取一个包含可变数量车辆名称的 txt 文件,并允许用户输入车辆名称,然后输入命令。

如何为数组列表中的每个项目创建一个对象?

这就是我目前所拥有的(我在代码 cmets 中放了一个我正在尝试做的例子):

public class VehicleApp {
public static void main(String[] args) throws FileNotFoundException, IOException{
    File myDir = new File(System.getProperty("user.dir"));
    File myFile = new File(myDir, "vehicleNames.txt");

    FileReader in = new FileReader(myFile);
    BufferedReader br = new BufferedReader(in);

    ArrayList<String> vehicleList = new ArrayList<>();

    int i = 0;
    String line = null;
    while((line = br.readLine()) != null){
        vehicleList.add(line);
        System.out.println(vehicleList.get(i));

        //What I'm essentially trying to accomplish:
        //Vehicle vehicleList.get(i) = new Vehicle();

        i++;
    }

    br.close();


    System.out.println("Enter user input as such:\n" +
            "<vehicle name>, <command>");
}
}

【问题讨论】:

    标签: java object arraylist


    【解决方案1】:

    vehicleList 列表的类型为 String。这意味着您只能将 String 对象添加到该列表中。

    因此,您必须将vehicleList 的类型更改为Vehicle

    ArrayList&lt;Vehicle&gt; vehicleList = new ArrayList&lt;&gt;();

    然后,您可以创建车辆对象并将它们传递到vehicleList 中:

    while((line = br.readLine()) != null){
            vehicleList.add(new Vehicle(line));
            System.out.println(vehicleList.get(i).getName());
    }
    

    请记住,您必须有一个接受名称的构造函数,以及该名称(成员字段)的存储空间:

    private String name;    
    public Vechicle(String _name)
    {
        name = _name;
    }
    

    在您的 Vehicle.java 班级中。

    为了使用System.out.println(vehicleList.get(i).getName()); 打印每个车辆对象的名称, 您必须在您的类中创建一个公共 getter 方法来检索车辆的名称:

    public String getName()
    {
        return name;
    }
    

    【讨论】:

    • 这看起来可能是我需要的。我要玩它,谢谢!
    • 我无法使用您的代码打印出每个车辆对象的名称。我收到一个错误“无法取消引用 int”。
    • 是的,你是对的,你必须把System.out.println(vehicleList.get(i.GetName()));改成System.out.println(vehicleList.get(i).GetName());
    • 非常感谢。非常非常有帮助。
    • 很高兴我能帮上忙! :)
    【解决方案2】:

    我假设您实际上想将 String 传递给 Vehicle 类,因为无法动态分配变量名:

    Vehicle newVehicle = new Vehicle(vehicleList.get(i));
    

    如果您实际上是想为ArrayList 中的每个项目创建一个新的Vehicle,您可以按如下方式进行:

    for(String s : vehicleList){
        Vehicle newVehicle = new Vehicle(s);
    }
    

    以上等价于:

    for(int i=0; i<vehicleList.size(); i++){
        Vehicle newVehicle = new Vehicle(vehicleList.get(i));
    }
    

    要根据传递给它的字符串识别Vehicle,您应该在Vehicle 类中使用getter:

    public class Vehicle {
        private String name;
    
        public Vehicle(String name){
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    

    现在您可以检查给定的Vehicle 是否有匹配的名称!例如:

    Vehicle vehicle = new Vehicle("Honda Civic");
    if(vehicle.getName().equals("Honda Civic")){
        System.out.println("Match!");
    }
    

    【讨论】:

    • 我确定我错了,但在我看来它只创建了一个名为 newVehicle 的对象。如果我在我的类中有一个名为 PowerOn() 的方法,我将如何调用它,比如说一辆名为 fastCar1 的车辆?
    • @TryingToCode 第一个代码只创建了一个新的Vehicle。但是for 循环中的对象创建了与vehicleList 中的元素一样多的Vehicle 对象
    • @TryingToCode 好的,如果你想识别名为“fastCar1”的车辆,遵循 OOP 原则,你应该在 Vehicle 类中使用一个 getter,这样你就可以验证你给它的名字确实是fastCar1
    • CanadianDavid,首先感谢您的帮助。恐怕我还是有点迷失在这里。我正在使用你的 for 循环,但我仍然不确定如何访问我创建的对象。在我的车辆类中,我有一个名为 PowerOn() 的方法,它只是将一个名为 PowerState 的布尔值设置为 true。那么假设fastCar1是vehicleList中的一个元素,我该如何为fastCar1对象调用PowerOn()呢?
    • 如果您需要访问您创建的车辆,那么您应该将它们添加到ListArrayList
    【解决方案3】:

    好的 - 首先要做的事。 你需要一个车辆类。 在名为 Vehicle.java 的文件中(重要)

    制作一个简单的类:

    public class Vehicle
    {
        //vehicle information
        private String name;
    
        //Constructors
        //default
        public Vehicle()
        {
            name = "";
        }
        //with param
        public Vechicle(String _name)
        {
            name = _name;
        }
    }
    

    现在更改您的数组列表以包含车辆对象

    ArrayList<Vehicle> vehicleList = new ArrayList<>();
    

    那么你的循环就是

    while((line = br.readLine()) != null)
    {
            vehicleList.add(new Vehicle(line));
    }
    

    这应该让你开始!

    【讨论】:

      猜你喜欢
      • 2022-12-06
      • 2017-11-18
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多