我想要哪种Java对象类型(collection / list / set / whatever)?

时间:2010-12-03 17:39:50

标签: java list collections set key-value

我想存储一组基于它们所代表的值键入的对象。这些键可以重复。 e.g:

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

基本上,我想循环遍历这个并查看每个键并说“是否有另一个对象(在这种情况下是人),其键在当前键的1之内?如果是,请匹配它们并从中删除它们这个系列。“我将在上面的示例中迭代“1”值,直到集合为空(或者为奇数场景保留一个对象)。

我不相信我试图解决这个问题的方式是最好的方式,所以我也愿意接受反馈。

4 个答案:

答案 0 :(得分:6)

你想要一个MultimapGuava提供此接口和各种子接口,例如ListMultimapSetMultimapSortedSetMultimap,具体取决于您希望将值存储在哪种类型的集合中。然后它提供各种实现,例如作为ArrayListMultimapHashMultimap,以及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>执行某项操作,这将使其键集和值集都已排序。

答案 1 :(得分:5)

Map<Integer, List<String>>怎么样,以一种避免碰撞的方式。它会将您的数据集更改为:

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

您必须稍微更改迭代器代码。您可以使用List元素的索引作为其“键”,当然您必须添加逻辑以使用空列表初始化Map或确保检查{{1} } Map的值。它取决于您如何生成null

答案 2 :(得分:1)

如下:

IDictionary<int,IList<Person>> 

我必须管理员,我不是100%遵循业务逻辑,但如果你可以为一个密钥设置多个值,那么这样的东西应该支持它。

- 编辑 - 忽略这一点 - 有人向我指出,这被标记为java问题。因此,回复:

Map<Integer, List<String>>

更合适。

答案 3 :(得分:1)

可能只是:列出CustomObject具有键和值的列表,然后按键对列表进行排序。

因为听起来你是按顺序处理它们,所以我认为Map可能有点矫枉过正,因为你想要按顺序遍历键并成对删除项目。