2014-10-13 5 views
0

Я пытаюсь добавить несколько значений в ArrayList с помощью инструкции if/else. Переменная numberOfShips объявляет, сколько полей. Однако, когда я печатаю .size(), размер составляет всего 1, причем последний добавленный объект является тем, который находится там. Я не могу понять, что я делаю неправильно. Я знаю, что ArrayList неявно увеличивается по размеру при добавлении элементов, так что этого не может быть.ArrayList не добавляет объекты inteded way

public ArrayList<Ship> createFleet(int choice) { 
    ArrayList<Ship> fleet = new ArrayList<Ship>(); 
    if (count < numberOfShips && choice > 0 && choice < 5) { 
     if (choice == 1) { 
      Ship ac = new Ship("Aircraft carrier", 5, false); 
      fleet.add(ac); 
      count++; 
      System.out.println("Aircraft carrier has been added to fleet."); 
     } else if (choice == 2) { 
      Ship bs = new Ship("Battleship", 4, false); 
      fleet.add(bs); 
      count++; 
      System.out.println("Battleship has been added to fleet."); 
     } else if (choice == 3) { 
      Ship sm = new Ship("Submarine", 3, false); 
      fleet.add(sm); 
      count++; 
      System.out.println("Submarine has been added to fleet."); 
     } else if (choice == 4) { 
      Ship ds = new Ship("Destroyer", 3, false); 
      fleet.add(ds); 
      count++; 
      System.out.println("Destroyer has been added to fleet."); 
     } else if (choice == 5) { 
      Ship sp = new Ship("Patrol Boat", 2, false); 
      fleet.add(sp); 
      count++; 
      System.out.println("Patrol boat has been added to fleet."); 
     } 
    } else { 
     System.out.println("Not an option."); 
    } 
    return fleet; 
} 
+0

Вы видели утверждение 'switch'? это может помочь вам здесь. – vikingsteve

+3

Если вы проходите выбор и ожидаете, что метод добавит судно в список _existing_, вам необходимо передать его в список вместо создания в новом методе 'new'. – khelwood

ответ

0

createFleet Ваш метод только добавляет один корабль в список, на основе выбора входного сигнала. Если вы хотите добавить несколько кораблей, вы должны запустить этот код в некотором цикле. Непонятно, почему вы передаете выбор методу в первую очередь, если хотите создать несколько кораблей.

Если ваша цель в том, чтобы создать несколько кораблей одного и того же типа, что вы можете сделать:

ArrayList<Ship> fleet = new ArrayList<Ship>(); 
for (int count=0; count < numberOfShips ; count++) { 
    if (choice == 1) ... 
} 

Ваш код может быть дополнительно улучшена за счет замены длинной if .. else if ... else if с переключателем заявления.

+0

Если я поместил код в цикл и я выбрал выбор, он выбирает один и тот же номер объекта. Мне нужно иметь возможность выбирать разные объекты корабля. – Rasmus

+0

@ user2740689 Где находится цикл? Если у вас есть цикл, который вызывает 'createFleet' несколько раз, каждый вызов будет создавать новый список с одним кораблем. – Eran

+0

Это в другом классе, вызывает метод. – Rasmus

1

Каждый раз, когда вы вызываете метод, вы создаете новый ArrayList. Вам необходимо поддерживать ArrayList кораблей вне вашего метода.

public ArrayList<Ship> createFleet(int choice) { 
    ArrayList<Ship> fleet = new ArrayList<Ship>(); //Here you create a new ArrayList and return it with a single Ship in it. 

Вам нужен глобальная контекстные ArrayList переменные:

private List<Ship> fleet = new ArrayList<Ship>(); 

public ArrayList<Ship> createFleet(int choice) { 
    if (count < numberOfShips && choice > 0 && choice < 5) { 
     if (choice == 1) { 
      Ship ac = new Ship("Aircraft carrier", 5, false); 
      fleet.add(ac); 
      count++; 
      System.out.println("Aircraft carrier has been added to fleet."); 
     } else if (choice == 2) { 
      Ship bs = new Ship("Battleship", 4, false); 
      fleet.add(bs); 
      count++; 
      System.out.println("Battleship has been added to fleet."); 
     } else if (choice == 3) { 
      Ship sm = new Ship("Submarine", 3, false); 
      fleet.add(sm); 
      count++; 
      System.out.println("Submarine has been added to fleet."); 
     } else if (choice == 4) { 
      Ship ds = new Ship("Destroyer", 3, false); 
      fleet.add(ds); 
      count++; 
      System.out.println("Destroyer has been added to fleet."); 
     } else if (choice == 5) { 
      Ship sp = new Ship("Patrol Boat", 2, false); 
      fleet.add(sp); 
      count++; 
      System.out.println("Patrol boat has been added to fleet."); 
     } 
    } else { 
     System.out.println("Not an option."); 
    } 
    return fleet; 
} 

Мое предложение заключается в создании Fleet класса, который содержит ссылку на ArrayList:

public class Fleet { 
    private List<Ship> internalFleet = new ArrayList<Ship>(); 
    private static int MAX_SHIPS = 10; 

    public void addShip(int choice){ 
     if (internalFleet.size() < MAX_SHIPS) { 
      Ship ship; 
      switch(choice){ 
       case 1: ship = new Ship("Aircraft carrier", 5, false); 
         break; 
       case 2: ship = new Ship("Battleship", 4, false); 
         break; 
       case 3: ship = new Ship("Submarine", 3, false); 
         break; 
       case 4: ship = new Ship("Destroyer", 3, false); 
         break; 
       case 5: ship = new Ship("Patrol Boat", 2, false); 
         break; 
       default: System.out.println("Not an option."); 
      } 
      if(ship!=null){ 
       internalFleet.add(ship); 
       System.out.println(ship.getName() + " has been added to fleet."); 
      } 
     } 
    } 
    public ArrayList<Ship> getFleet(){ 
     return internalFleet; 
    } 
} 
0
for(int count=0; count < numberOfShips ; count++){ 
    if (choice == 1) { 
     fleet.add(new Ship("Aircraft carrier", 5, false)); 
     System.out.println("Aircraft carrier has been added to fleet."); 
    } 
    else if ... 
} 
Смежные вопросы