【问题标题】:ArrayList objects (java)ArrayList 对象 (java)
【发布时间】:2015-05-29 04:05:48
【问题描述】:

我坚持这个逻辑,我的项目需要帮助。
我有一个包含 5 个车辆名称的文本文件。
然后我必须将它们读入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 中有 5 辆车(因此在 ArrayList 中)命名为:Audi、Bmw、Mercedez、Volkswagen、Porsche。 问题是,无论我在车辆名称命令中输入什么,程序默认采用最后一个元素,在本例中为 ArrayList 中的保时捷。 即,当我说“Audi, powerON”时,它仍然会打印出“Porsche is power ON”。

我认为我在链接用户输入的名称以检查 ArrayList 并将其引用到该特定对象时搞砸了。

【问题讨论】:

  • 是的,您有 一个 newVehicle 对象,并且您将每个项目分配给它。最后,最后的任务是剩下的。此外,您应该使用try-with-resources 块来关闭您的BufferedReader
  • 您的用户是否使用正则表达式?如果在第一个“if”语句中没有使用 .equals(),并且在我的经验中,switch 函数对字符串有点不好,请考虑在那里也使用 if 语句
  • 您的 newVehicle 变量是 one 变量,其中包含 one 车辆实例,因此如果您在循环中为其赋值,它将保留最后一个。如果您想拥有一个列表车辆,那么您必须创建并填充一个列表。
  • switch 块而不是 newVehicle.getName() 你必须使用 vehicleNamesArray.get(i).getName()userVehicleName
  • @Titus 你是从哪里得到这个想法的?

标签: java arraylist


【解决方案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 loop 中检索该车辆对象并更新它:

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;
 ...
 ...

【讨论】:

    【解决方案2】:

    您可能想尝试将车辆存放在 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,valuekey=carname value=Vehicle object。这将使您可以轻松返回并根据用户输入选择您想要的汽车。此外,目前您不存储您的 Vehicle 对象,您只存储最后一个...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 2016-04-11
      • 2016-08-22
      • 2014-03-20
      • 2017-04-08
      • 2015-04-29
      相关资源
      最近更新 更多