Карта футбольной команды Java, которая ссылается на список объектов команды - PullRequest
0 голосов
/ 03 марта 2019

Я новичок в Java и в настоящее время застрял на вопросе о назначении.

Мне нужно создать метод для класса LeagueAdmin с именем addTeam (), который принимает два аргумента и не возвращает значения.Мне дан заголовок: public void addTeam (String Division, Team team)

Метод должен проверить, существует ли список для этого подразделения на карте команд.

Еслисписок существует, тогда новая команда должна быть добавлена ​​в существующий список команд для этого подразделения.

Если список не существует, то должен быть создан новый пустой список команды и добавлена ​​новая команда.к этому, тогда новая пара ключ-значение должна быть создана в командах с делением в качестве ключа и новым списком в качестве значения.

Пока мой код выглядит следующим образом:

import java.util.*;
public class LeagueAdmin
{
    public Map<String, List<Team>> teams;
    /**
    * Constructor for objects of class LeagueAdmin
    */
    public LeagueAdmin()
    {
        this.teams = new HashMap<String, List<Team>>();
    }
}

У меня есть отдельный класс следующим образом:

public class Team
{  
    private String name;
    private String division;
    private int won;
    private int drew;
    private int lost;
    // no need to record points as = 3*won + drew   


    /**
    * Constructor for objects of class Team
    */
    public Team(String aName, String aDivision)
    {
        name = aName;
        division = aDivision;
        // no need to set won, drew and lost to 0
    }
}

Если кто-нибудь может дать мне несколько советов, которые были бы великолепны,

Спасибо, Кэт

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Ответ от LppEdd , предлагающий computeIfAbsent, верен, но, возможно, не то, что ищет ваш преподаватель курса.Вероятно, он / она хочет, чтобы вы использовали больше кодирования, чем мы это делали в реальной работе до того, как этот новый метод был добавлен недавно.

Старомодный метод addTeam(String division, Team team), который нужно добавить в LeagueAdmin спросит карту, есть ли у нее ключ для строки деления.Если такого ключа нет, добавьте его и укажите в качестве его значения новый пустой List команд, в которые вы добавили соответствующую команду.Если такой ключ существует, извлеките его значение a List, а затем добавьте соответствующую команду в этот список.

В качестве домашнего задания, для обучения вам нужно немного с этим бороться, а не копировать какой-либо существующий код. Изучите JavaDoc для интерфейсов Map и List.Следуйте моей прозе выше как псевдокод, чтобы провести вас по логике.Убедитесь, что вы понимаете идеи, стоящие за каждым классом, особенно пара ключ-значение карты (также известная как словарь или ассоциативный массив ).Нарисуйте диаграмму на бумаге, представляя каждый шаг, который я обрисовал выше.

Таким образом, объект лиги содержит объект Map.Карта содержит набор ключей, каждый из которых является именем подразделения (String в вашей ситуации, более вероятно, класс Division в реальной работе).Быть ключом на карте означает, что каждое имя подразделения приведет вас к объекту List, совокупности команд.List хранит элементы в том порядке, в котором они были добавлены.Кстати, Set хотел бы работать и здесь.

Обратите внимание, что на этой диаграмме один из объектов List пуст, то есть ему еще не назначены команды.Пустой список не ничто;пустой список это что-то.Пустой список по-прежнему является действительным объектом, точно так же, как корзина с фруктами, в которой нет фруктов, по-прежнему является корзиной.Если никакому списку, пустому или нет, еще не назначен ключ на карте, он указывает на null, где null действительно означает «вообще ничего».На этой диаграмме мы видим, что клавише «Division-Z» на карте еще не был назначен какой-либо объект List, поэтому он ничего не указывает, null.

diagram of a

0 голосов
/ 03 марта 2019

Прежде чем ответить на ваш вопрос, пара предложений.

  • всегда объявляйте локальные переменные и поля как final, когда это возможно
  • всегда форматируйте ваш код.Кажется излишним, но это то, что я не вижу, часто делается
  • инициализировать final поля в строке , не внутри конструктора, если возможно
  • не раскрыватьполя, которые являются частью деталей реализации

Редактировать: возможно, вам нужна упрощенная версия, я также добавлю это, , но продолжайте читать весь мой ответ, это весело!

Следуйте комментариям внутри кода, чтобы понять процесс.

public class LeagueAdmin {
    private final Map<String, List<Team>> teams = new HashMap<String, List<Team>>();

    public void addTeam(final String division, final Team team) {
        // We retrieve the team list, if any
        List<Team> list = map.get(division);

        // We check if the list was already there, or we have to create a new one
        if (list == null) {
           // The list is null, we need to insert a new one!
           list = new ArrayList<>();
           map.put(division, list);
        }

        // We add the team to the list
        list.add(team);
    }
}

Теперь, для более "новой" и упрощенной версии, , которая делаетто же самое, что и выше , реализация будет

public class LeagueAdmin {
    private final Map<String, List<Team>> teams = new HashMap<String, List<Team>>();

    public void addTeam(final String division, final Team team) {
       teams.computeIfAbsent(division, __ -> new ArrayList<>()).add(team);
    }
}

Начиная с Java 8, интерфейс Map предоставляет новый метод

computeIfAbsent(Key, Function)

Что это делаетis

  1. попытаться получить значение, связанное с введенным ключом
  2. , если значение не найдено, используйте аргумент Function, чтобы связать новое значение
  3. , вернуть соответствующее значение

Кроме того, вы спросите себя, что такое __ ->.
Ну, __ - это просто допустимое имя переменной, которое используется для выражения «эй, мне это не нужно»
-> (стрелка) является частью лямбда-выражения, которое в основном является in-line функция

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...