Какой тип объекта Java (коллекция / список / набор / что угодно) я хочу для этого?
-
30-09-2019 - |
Вопрос
Я хочу хранить коллекцию объектов, которые являются ключными на основе значения, которую они представляют. Эти ключи могу быть повторенным. например:
[4] => Bob
[5] => Mary
[5] => Sue
[9] => Steve
[10] => Jason
[10] => Michelle
По сути, я хочу зацикливаться через это и посмотреть на каждый ключ и сказать: «Есть ли другой объект (человек в этом случае), ключ которого находится в пределах 1 от текущего ключа? Если это так, сопоставьте их и удалите их из коллекции. " Я собираюсь повторить значение «1» в примере выше, пока сбор не будет пустым (или имеет один объект, оставшийся для нечетных сценариев).
Я не убежден, как я пытаюсь пойти, это лучший способ, поэтому я тоже открыт для обратной связи.
Решение
Вы хотите а MultiMap. Гуава предоставляет этот интерфейс и различные подзаимные средства, такие как ListMultimap
, SetMultimap
а также SortedSetMultimap
В зависимости от того, какую коллекцию вы хотите, чтобы значения были сохранены. Затем он предоставляет различные реализации, такие как ArrayListMultimap
а также HashMultimap
, плюс различные созностности для использования с ними в MultiMaps..
Традиционный способ сделать это в Java это что-то вроде Map<K, List<V>>
, Map<K, Set<V>>
И т. Д., Но поддержание коллекций ценностей утомительно и различные операции, которые должны быть простыми (например, просто вкладывание значения для ключа) намного сложнее, чем они должны быть.
Multimap
Предназначен как структура данных, специально предназначенная для моделирования нескольких значений, отображаемых с одним ключом (в отличие от Map
). Учитывая, что это делает операции так же просто, как и следовало ожидать:
ListMultimap<Integer, String> m = ArrayListMultimap.create();
m.put(4, "Bob");
m.put(5, "Mary");
m.put(5, "Sue");
...
for (String name : m.get(5)) { ... } // iterates ["Mary", "Sue"]
Если вы хотите убедиться, что то же значение не будет сопоставлено в один ключ дважды, и не заботится о заказе, указанные значения, вы можете использовать SetMultimap
вместо а ListMultimap
, так далее.
Я не уверен, что вы имеете в виду, насколько это возможно, есть еще один объект, ключ которого находится в пределах 1 от текущего ключа? Если это так, сопоставьте их и удалите их из коллекции ». Но если я читаю это правильно, вы могли бы сделать что-то вроде этого:
for (Integer key : m.keySet()) {
Collection<String> people = m.get(key);
Collection<String> peopleOneLower = m.get(key - 1); // empty if there are none
...
}
В качестве альтернативы вы могли бы сделать что-то с TreeMultimap<Integer, String>
У кого будет как его набор ключей, так и наборы стоимости отсортированы.
Другие советы
Как насчет А. Map<Integer, List<String>>
, в своем роде столкновение - избегая способа. Это изменит ваши данные, чтобы выглядеть так:
[4] => [Bob]
[5] => [Mary, Sue]
[9] => [Steve]
[10] => [Jason, Michelle]
Вы должны немного изменить код итераторов немного. Вы бы использовали индексы List
элементы как их «ключи», и, конечно, вам придется добавить логику для инициализации вашего Map
с пустыми списками или обязательно проверьте ваш Map
ценности для null
. Отказ Это будет зависеть от того, как вы генерируете свой Map
.
Как насчет чего-то вроде:
IDictionary<int,IList<Person>>
Я должен администрировать, я не на 100% следую за деловой логикой, но если вы можете иметь несколько значений для одного ключа, что-то вроде этого должна поддерживать его.
- Редактировать - игнорировать это - было указано мне, что это было помечено как вопрос о Java. Поэтому ответ с:
Map<Integer, List<String>>
гораздо более уместно.
Может быть, просто что-то вроде: Список, где CustomObject имеет ключ и значение, и вы сортируете список по ключу.
Поскольку звучит так, будто вы обрабатываете их по порядку, я думаю, что карта может быть излишне, так как вы захотите проиграть по ключам по порядку и удалять предметы в парах.