Возникли проблемы с доступом и обращением к HashMap в Java - PullRequest
1 голос
/ 11 апреля 2019

Я пытаюсь написать программу, которая обрабатывает хранение учеников и соответствующих предметов, но я относительно новичок в списках Java и испытываю трудности с тем, чтобы класс сохранял и выводил учеников и предметы. До сих пор я могу получить его для хранения учащегося и класса, но не буду брать несколько или только возвращает самый последний добавленный.

private static Map<String, Set<String>> cohort = new HashMap<~>();

public static void signOn(String class, String student) {
    Set<String> studentSet = new HashSet<String>();
    studentSet.add(student);
    cohort.put(class, studentSet);
}

public static Map<String, Set<String>> getCohort() {
    return cohort;
}

При звонке getCohort() я пытаюсь заставить его вернуть всех студентов, которые вошли в систему, но он возвращает только самого последнего добавленного студента. Я не уверен, что мне не хватает чего-то простого, но я просто могу Похоже, что это правильно, любая помощь будет очень признательна.

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

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

Попробуйте следующее:

Set<String> studentSet = cohort.get(class);
if(studentSet == null){
  studentSet = new HashSet<String>();
  cohort.put(class, studentSet);
}
studentSet.add(student);

В качестве примечания я хотел бы добавить, что «класс» не совсем подходит для вашей строковой переменной, так как это зарезервированное слово Java.

1 голос
/ 11 апреля 2019

in signOn Когда вы добавляете нового ученика, вы создаете новый Набор, добавляете в него одного ученика и затем переопределяете любой Набор, который уже был там.Это означает, что у вас всегда будет только один ученик.

Что вам нужно сделать, это сначала получить текущий набор учеников в классе, а затем добавить к ним вашего ученика.

Пример кода:

    public static void signOn(String class, String student)
    {
        Set<String> studentSet = cohort.get(class);
        if (studentSet == null) {
            studentSet = new HashSet<String>();
            cohort.put(class, studentSet);
        }
        studentSet.add(student);
    }

Это должно работать, так как studentSet будет ссылкой на studentSet, который хранится в когорте.Я только что написал это по памяти, так что никаких обещаний он работает с первой попытки, но это общая идея.

0 голосов
/ 11 апреля 2019

Вы сталкиваетесь с проблемой, когда ставите new Set every time (также, когда класс ученика такой же), что в основном переопределяет старое значение.Таким образом, вы должны поместить ученика в тот же набор, если класс тот же.Используя Java 8, вы можете сделать следующее: -

public static void signOn(String cls, String student) {
    cohort.computeIfAbsent(cls, k -> {
        Set<String> studentSet = new HashSet<>();
        studentSet.add(student);
        return set;
    });

    cohort.computeIfPresent(cls, (k, v) -> {
        v.add(student);
        return v;
    });
}

Примечание: вы не можете иметь имя переменной class, это зарезервированное ключевое слово в java.

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