Q1: это зависит от того, насколько эффективно вы хотите выполнять поиск .. на данный момент, так как вы не сохраняете обратные ссылки, вы должны сначала найти, в какой ветви находится ваш игрок, а затем искать, в каком клубе есть ваша ветвь. .
С хорошим equals
методом для ваших Branch
и Player
классов это тривиально:
for (Team t : teamList)
{
if (t.branches.contains(player))
return true;
}
return false;
Но это не будет эффективно, так как у вас будет сложность O (n * m) , где n - размер команды, а m - средний размер ветки.
Если вы хотите что-то более эффективное, я бы посоветовал вам хранить обратные ссылки внутри ваших классов, у вас может быть класс Player
с двумя атрибутами
Branch currentBranch
Team currentTeam
и вы можете установить их, когда добавляете игрока в ветку / команду.
В противном случае вы можете оставить отдельный HashMap
, который отображает каждого игрока в его ветку / команду. Меньше памяти, но довольно просто.
Q2: чтобы удалить Player
из его ветви / команды, вам просто нужно знать, в каком из них он находится .. (используя ответ на вопрос Q1), затем перед удалением из players
вы просто удалите его из соответствующего филиал / команда:
Branch b = findWhichBranch(player);
Team t = findWhichTeam(player);
b.remove(player);
t.remove(player);
players[index] = null;
Конечно, если команда подразумевает ветвь, вы просто удалите ее из ветви, поскольку между игроком и командой нет прямой связи.