2015-05-28 3 views
3

Я придерживался логики и нуждался в помощи для моего проекта.
У меня есть текстовый файл с 5 названиями автомобилей.
Тогда я должен читать их в ArrayList, который я с помощью:Объекты ArrayList (java)

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

Каждый из этих объектов имеет следующие атрибуты: power, angle, speed; и поведений: powerOn(), powerOff(), SpeedUp(), SlowDown() и т. Д., Которые я определил в Vehicle класс.

Теперь пользователь должен ввести команду Vehicle name. Затем я разделил их и взял [0], который является именем транспортного средства, и должен сначала проверить, является ли это одним из тех названий транспортных средств в ArrayList (полученный из txt-файла), и если он затем должен отнести его к этому конкретному объекту Я создал выше. И тогда придется взять в [1], что команда, которая соответствует конкретному поведению объекта, который может быть powerOn, speedUp, и т.д. и т.п ..

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

Например, давайте рассмотрим есть 5 транспортных средств в txt (таким образом, в ArrayList), названный: Audi, Bmw, Mercedez, Volkswagen, Porsche. Проблема в том, что независимо от того, что я вхожу в команду имени транспортного средства, программа по умолчанию принимает последний элемент, в данном случае Porsche в ArrayList. I.e., когда я говорю «Audi, powerON», он все еще печатает «Porsche включен».

Я думаю, что я испортил ссылку на введенное имя для проверки с помощью ArrayList, а затем ссылался на этот конкретный объект.

+3

Да, у вас есть ** один ** 'новый объект Vehicle', и вы назначаете ему каждый элемент. В конце концов последнее задание - это то, что осталось. Кроме того, вы должны использовать блок «try-with-resources», чтобы закрыть «BufferedReader». –

+1

Использует ли ваш пользователь регулярное выражение? если нет в первом выражении «если».equals(), и в моей функции переключения срока действия работает с ошибкой со строками, рассмотрите также и операторы – itwasntme

+0

. Ваша переменная 'newVehicle' - * одна * переменная, удерживающая * один * экземпляр транспортного средства, поэтому, если вы присвоите ему значение в цикл, он сохранит последний. Если вы хотите иметь * список * транспортных средств, вам нужно создать и заполнить список. – Holger

ответ

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

он работает. Спасибо –

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 object. Это упростит возврат и выбор автомобиля, который вы хотите, на основе пользовательского ввода. Также в настоящее время вы не хранить ваши Vehicle объекты, которые вы только хранящих последний ...

Смежные вопросы