Первое правило разработки программного обеспечения - «используйте правильную структуру данных для работы». В существующем состоянии вы сохраняете экземпляры корабля в ArrayList
, что позволяет получать элементы только по индексу.
Хотя вы и не предоставили запрошенные образцы данных, достаточно просто сделать вывод, что token[3]
- это название корабля, к которому принадлежит член экипажа, поэтому вам нужно выяснить, как получить объект по имени.
К счастью, Java предоставляет вам HashMap , в котором хранятся пары ключ-значение. Вы можете использовать название корабля в качестве ключа. Когда вы передадите этот ключ в HashMap, он вернет значение, связанное с этим ключом - в вашем случае, тот экземпляр корабля, который вам нужен.
1) Убедитесь, что ваш класс импортирует java.util.HashMap;
2) Объявите свой HashMap. Вместо:
ArrayList<Starship> ships = new ArrayList<Starship>();
использование:
HashMap<String, Starship> = new HashMap<String, Starship>();
В этой ситуации ключом является строка, представляющая название корабля. Экземпляр корабля с таким именем является значением.
3) При добавлении нового корабля вам нужно будет обновить свой метод addStarship()
, чтобы он брал строковый аргумент в дополнение к аргументу звездного корабля, который он уже занимает:
public void addStarship(String name, Starship ship)
4) В теле addStarship()
вы должны добавить корабль, используя put()
метод:
ships.put(name, ship);
Помните, здесь ships
- это экземпляр HashMap
, который вы используете для хранения своих кораблей. name
- это строка, представляющая название корабля, а ship
- объект корабля.
5) Когда вы пытаетесь получить корабль, вы используете метод get()
:
ships.get(name);
В вашем случае код может выглядеть следующим образом:
ships.get(tokens[3].addCrewMember(member));
Имейте в виду, что с HashMap
вы больше не можете получать значения по индексу, как с ArrayList
. HashMap
по определению является неупорядоченным набором, то есть первый элемент структуры может быть или не быть первым добавленным вами объектом, и даже если вы получили доступ к объекту в первой позиции, нет гарантии, что он все еще будет находиться в этом слоте, если вы попытаетесь получить к нему доступ позже - его позиция в HashMap
могла измениться, поэтому вы, как правило, будете получать значения только с помощью ключа.
Пожалуйста, убедитесь, что вы прочитали официальную документацию, на которую я ссылался, выше.