Вы хотите Multimap . Guava предоставляет этот интерфейс и различные подинтерфейсы, такие как ListMultimap
, SetMultimap
и SortedSetMultimap
, в зависимости от того, в каком виде коллекции вы хотите хранить значения. Затем он предоставляет различные реализации, такие как ArrayListMultimap
и HashMultimap
, плюс различные utlities для использования с ними в 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>
, у которого будут отсортированы как набор ключей, так и наборы значений.