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

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

 [4] => Bob
 [5] => Mary
 [5] => Sue
 [9] => Steve
[10] => Jason
[10] => Michelle

По сути, я хочу пройтись по этому циклу, посмотреть на каждый ключ и сказать: «Есть ли другой объект (человек в данном случае), чей ключ находится в пределах 1 от текущего ключа? Если так, сопоставьте их и удалите их из Коллекция." Я собираюсь повторять значение «1» в приведенном выше примере до тех пор, пока коллекция не станет пустой (или пока не останется один объект для нечетных сценариев).

Я не убежден, что лучший способ это сделать, поэтому я тоже готов к обратной связи.

Ответы [ 4 ]

6 голосов
/ 03 декабря 2010

Вы хотите 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>, у которого будут отсортированы как набор ключей, так и наборы значений.

5 голосов
/ 03 декабря 2010

Как насчет Map<Integer, List<String>>, в некотором роде, избегая столкновений.Это изменит ваш набор данных так:

 [4] => [Bob]
 [5] => [Mary, Sue]
 [9] => [Steve]
[10] => [Jason, Michelle]

Вам придется немного изменить код итератора.Вы бы использовали индексы элементов List в качестве их «ключей», и, конечно, вам нужно было бы добавить логику для инициализации вашего Map с пустыми списками или проверить значения Map для null,Это будет зависеть от того, как вы генерируете Map.

.
1 голос
/ 03 декабря 2010

Может быть просто что-то вроде: список, где CustomObject имеет ваш ключ и значение, и вы сортируете список по ключу.

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

1 голос
/ 03 декабря 2010

Что-то вроде:

IDictionary<int,IList<Person>> 

Мне нужно администратор, я не на 100% следую бизнес-логике, но если вы можете иметь несколько значений для одного ключа, что-то вроде этого должно поддерживатьэто.

- Редактировать - Игнорировать это - мне было указано, что это было помечено как вопрос Java.Поэтому ответ с:

Map<Integer, List<String>>

гораздо более уместен.

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