Какой тип объекта Java (коллекция / список / набор / что угодно) я хочу для этого?

StackOverflow https://stackoverflow.com/questions/4348253

Вопрос

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

 [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 имеет ключ и значение, и вы сортируете список по ключу.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top