Когда я держу карту <Identifier, Object> против коллекции <object with identifier as field>

127
11

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

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

У меня теперь есть три и, возможно, даже больше, варианты того, как это сделать:

Пусть мой объект содержит свой собственный идентификатор и все остальные его поля. Теперь я использую простой массив (или любой другой простой набор) моих объектов, в которых он мне нужен. Когда я ищу один конкретный объект, я просматриваю свой список и проверяю равенство идентификатора.

Плюсы: 1. "Ясность" для каждого экземпляра объекта. 2.? Минусы: манипулирование коллекцией этих объектов раздражает

Пусть мой объект содержит все поля рядом с его идентификатором. Теперь я использую карту с идентификатором в качестве ключа, а объект - как значение. При поиске одного конкретного объекта я просто просматриваю идентификатор на карте.

Плюсы: простой поиск и вставки ,? Минусы: сам экземпляр объекта не знает, что это такое ,?

Комбинация обоих: используйте карту с идентификатором в качестве ключа и объект, имеющий свой собственный идентификатор, в качестве поля в качестве значения.

Плюсы: упоминалось выше. Минусы: выглядит излишним для меня.

Какие ситуации потребуются для чего? Позвольте использовать стандартный приветственный пример сети, например, чат-сервера: как я могу обрабатывать несколько "групп/каналов", в которых находятся люди? Как насчет других приложений?

спросил(а) 2017-11-02T06:19:00+03:00 3 года, 4 месяца назад
1
Решение
75

Ваш вопрос очень широк и, фактически, содержит два вопроса.

Сначала "Какая структура данных лучше - словарь или список?". Ответ: это зависит от производительности, которую вы хотите достичь при вставке и поиске. В принципе, если вам нужно просмотреть коллекцию, тогда список будет в порядке, и если вам нужно быстро найти, то словарь лучше. У словаря больше накладных расходов, чем на список.

Второй: "Нужно ли иметь поле идентификатора внутри объекта или использовать встроенный хеш-код?". Ответ: это зависит от того, как вы будете использовать свой объект. Если вы хотите, чтобы Id просто сохранил его в словаре, то, скорее всего, вы можете пойти с хэш-кодом. Нет ничего плохого в сохранении идентификатора объекта внутри этого объекта. Либо вы используете Id или хеш-код, вы должны быть уверены, что этот объект будет уникально идентифицирован идентификатором или хэшем. Это главная проблема с этим.

Вы можете переопределить метод GetHashCode и вернуть его идентификатор вашего объекта. Иногда вы можете найти такую реализацию, когда хэш-код необходим для сбора, и для базы данных требуется идентификатор.

Таким образом, это действительно не имеет значения, что вы выберете в конце, если оба подхода работают на вас прямо сейчас.

ответил(а) 2017-11-02T11:31:00+03:00 3 года, 4 месяца назад
43

На этот вопрос могут ответить два руководства:

Вариант использования, который требует поиска, где есть ожидание отношения 1:1 между ключом и значением, подразумевает структуру карты. ООП подразумевает, что ключ, который так тесно связан с объектом, чтобы предварительно сформировать поиск, должен быть инкапсулирован внутри этого объекта.

Что касается вопроса избыточности, рассмотрим, что ключ на карте - это не что иное, как индекс. Индексы так же распространены в данных, как и в книгах.

ответил(а) 2017-11-03T01:27:00+03:00 3 года, 4 месяца назад
43

map<Identifier, Object> предложит вам O (1) производительность при извлечении объекта на основе его идентификатора. Конечно, есть ситуации, когда вы хотите этого достичь.


Однако в других случаях может оказаться излишним использовать этот подход. Все зависит от ситуации.

ответил(а) 2017-11-02T11:34:00+03:00 3 года, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема