ArrayList对象(Java)

3

我被逻辑困住了,需要帮助完成我的项目。
我有一个包含五个车名的文本文件。
然后我要读取它们到一个 ArrayList 中,我使用了以下方法:

public static void main(String[] args) throws IOException
{
    BufferedReader bTextFileVehicleNames = new BufferedReader(new FileReader("vehicles.txt"));
    ArrayList<String> vechicleNamesArray = new ArrayList<String>();
    while((textFileLine = bTextFileVehicleNames.readLine()) != null)
    { 
        vehicleNamesArray.add(textFileLine);
    }

现在,我需要为ArrayList中的每个项(车名)创建一个对象,我使用以下代码实现:

for(String s : vehicleNamesArray)
{
    newVehicle = new Vehicle(s);
    //I defined this Vehicle newVehicle = null; in the main class. My main is also in the same Vehicle.java file.
}

每个对象都有属性:poweranglespeed;和行为:powerOn()powerOff()SpeedUp()SlowDown()等等.. 这些都是我在Vehicle类中定义的。
现在,用户必须输入车辆名称命令。然后我将其拆分并取出[0],即车辆名称,并首先检查它是否是ArrayList(来自txt文件)中的其中一个车辆名称,如果是,则必须将其引用到我上面创建的特定对象。 然后必须接受[1],这是相应于对象特定行为的命令,可以是powerOnspeedUp等等。
for (int i=0; i< vehicleNamesArray.size(); i++)
{
    if (vehicleNamesArray.get(i).matches(userVehicleName))
      //userVehicleName is the [0] vehicle name entered by user
      //userVehicleCommand is the [1] command entered by user
    {
        switch (userVehicleCommand.toLowerCase()) 
        {
        case "power on":
            newVehicle.powerOn(); //calling that particular bahaviour of the object defined in Vehicle class.
            System.out.println(newVehicle.getName()+" is powered ON.");
            break;
        ...
    ...

例如,假设在 txt 中(因此在 ArrayList 中)有 5 辆车,它们的名称分别是:Audi、Bmw、Mercedez、Volkswagen 和 Porsche。 问题在于,无论我在车辆名称命令中输入什么,程序默认都会采取最后一个元素,也就是在这种情况下的 Porsche 在 ArrayList 中。 也就是说,当我说“奥迪,powerON”时,它仍然打印出“保时捷已启动”。 我认为我在将用户输入的名称与 ArrayList 检查并将其引用到特定对象方面搞糟了。

3
是的,你有一个 newVehicle 对象,并将每个条目都分配给它。最后一次赋值是留下来的。此外,你应该使用try-with-resources代码块来关闭BufferedReader - Boris the Spider
1
你的用户使用正则表达式吗?如果第一个“if”语句中没有使用,请使用“.equals()”函数。根据我的经验,switch函数在处理字符串时效果不佳,考虑在那里也使用if语句。 - itwasntme
switch 块中,你需要使用 vehicleNamesArray.get(i).getName() 或者 userVehicleName,而不是 newVehicle.getName() - Titus
@RajivGanti,你没有把你的 Vehicle 对象存储在任何地方,你只是设置了 newVehicle = new Vehicle(""),这样 arraylist 中的最后一个对象将被存储在 newVehicle 中... - brso05
@BoristheSpider 你说得对,我以为他是在列表中存储“Vehicle”。 - Titus
显示剩余4条评论
2个回答

1
保留在 List 中创建的对象:
List<Vehicle> vehicleList = new ArrayList<>;
for(String s : vehicleNamesArray)
{
    newVehicle = new Vehicle(s);
    vehicleList.add(newVehicle);
  //I defined this Vehicle newVehicle = null; in the main class. My main is also in the same Vehicle.java file.
} 

然后在你的第二个for循环中检索该车辆对象并更新它:

for (int i=0; i< vehicleNamesArray.size(); i++)
{
    if (vehicleNamesArray.get(i).matches(userVehicleName))
        //userVehicleName is the [0] vehicle name entered by user
        //userVehicleCommand is the [1] command entered by user
    {
        switch (userVehicleCommand.toLowerCase()) 
            {
               case "power on":

               vehicleList.get(i).powerOn(); //calling that particular bahaviour of the object defined in Vehicle class.
               System.out.println(vehicleList.get(i).getName()+" is powered ON.");
               break;
 ...
 ...

0
你可能想尝试将车辆存储在一个HashMap或类似的数据结构中:
HashMap<String, Vehicle> vehicles = new HashMap<String, Vehicles>();

for(String s : vehicleNamesArray)
{
    vehicles.put(s, new Vehicle(s));
}

//Access the vehicle from user input

Vehicle currentVehicle = vehicles.get(userVehicleName);

switch (userVehicleCommand.toLowerCase()) 
{
    case "power on":
    currentVehicle.powerOn(); //calling that particular bahaviour of the object defined in Vehicle class.
    System.out.println(currentVehicle.getName()+" is powered ON.");
    break;
    //etc...
}

一个 HashMap 可以用于存储你的情况下的 key,value 对,其中 key=carnamevalue=Vehicle对象。这将使根据用户输入轻松返回并选择所需车辆。同时,目前您并未存储您的 Vehicle 对象,您只存储了最后一个...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接