Могут ли несколько разных карт использовать один и тот же набор ключей? - PullRequest
0 голосов
/ 30 октября 2018

В частности, я работаю с Java, но даже если это невозможно в Java, мне интересно знать, возможно ли это вообще на каком-либо языке.

У меня есть набор объектов Exam в классе Student, представляющий экзамены, которые сдал студент, и для каждого экзамена в наборе я хочу отслеживать ответы обоих учащихся на вопросы экзамена, и я хочу отслеживать оценки студента на каждом экзамене.

Самый простой способ добиться этого - просто иметь две карты для каждого отношения. Однако я хочу быть в состоянии гарантировать, что любой ключ, который существует на карте, существует для всех карт, и удаление ключа с любой из карт должно удалить его со всех карт. Также кажется, что было бы эффективнее иметь один общий набор ключей, когда все ключи каждой карты действительно представляют одно и то же: набор экзаменов, которые сдал студент.

Так можно ли сделать несколько разных карт зависимыми от одного и того же набора ключей? И независимо от того, возможно ли это, есть ли причина, по которой это будет просто плохой идеей?

Спасибо! Я ценю любые советы:)

Edit: для записи, я имею в виду только создание экземпляра новой карты, а затем итерацию по набору ключей исходной карты, добавление каждого ключа к новой карте, но я не думаю, что это будет делать то, что я хочу. Я хотел бы создать новый набор ключей, который просто содержит все ссылки на оригинальный набор ключей. Мои две карты фактически не будут зависеть от одного и того же набора ключей, поэтому изменение одной из них не повлияет на другую, как следует.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Так можно ли сделать несколько разных карт зависимыми от одного и того же набора ключей?

Самый простой подход - иметь одну Карту, в которой значение содержит все значения других карт.

Так

  • есть только один набор ключей.
  • добавление ключа добавляет все значения.
  • удаление ключа удаляет все значения.

Вместо сказать

Map<String, String> nameMap
Map<String, Long> counterMap
Map<String, Double> scoreMap

вместо вас значение

class Values {
    String name;
    long counter;
    double score;
}

Map<String, Values> valuesMap;

Можно создать виды этой Карты, чтобы они выглядели как исходные несколько Карт, но это вряд ли стоит усилий.

0 голосов
/ 30 октября 2018

Хорошо, в Java (и большинстве языков) набор ключей тесно связан внутри реализации Map, потому что это влияет на то, как ключи ищутся, чтобы найти их значения. Один Map может использовать реализацию HashSet, связывающую объекты-значения с ключами, и обрабатывать коллизии хешей, тогда как другой Map может использовать TreeSet. Вы можете создать свою собственную реализацию Map, но я подозреваю, что это просто неправильная модель.

Почему бы тебе немного не изменить подход? Вы говорите, что у вас, по сути, есть один набор ключей, Student s и несколько значений, набор Exam s, полученный студентом, и набор Grade s для каждого Exam.

Так что, если вы создали новый класс с именем StudentExams, в котором у вас есть Map<Exam, Grade>.

public class StudentExams {
  private Map<Exam, Grade> examGrades = ... //choose whatever you want

  //... constructor and setter methods here if you need them

  public Set<Exam> getExams() {
     return examGrades.keySet();
  }

  /**
    * Returns the Grade for the exam the student took, 
    * or Optional.empty() if the student did not take that exam.
    */ 
  public Optional<Grade> getGrade(Exam exam) {
     return Optional.ofNullable(examGrades.get(exam));
  }
}

Тогда в вашем основном Map у вас есть Map<Student, StudentExams>.

Таким образом, для каждого ученика вы можете получить его StudentExams и извлечь набор из Exam объектов вместе с их Grade объектами.

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