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

Mat*_*ins 2 java collections list set key-value

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

 [4] => Bob
 [5] => Mary
 [5] => Sue
 [9] => Steve
[10] => Jason
[10] => Michelle
Run Code Online (Sandbox Code Playgroud)

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

我不相信我试图这样做的方式是最好的方式,所以我也愿意接受反馈.

Col*_*inD 6

你想要一个Multimap.Guava提供了这个接口和各种子接口,例如ListMultimap,SetMultimap并且SortedSetMultimap取决于您希望将值存储在何种类型的集合中.然后它提供各种实现,例如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"]
Run Code Online (Sandbox Code Playgroud)

如果您想确保相同的值没有映射到单个键两次并且不关心值的顺序,则可以使用a SetMultimap而不是a 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
  ...
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用TreeMultimap<Integer, String>其键集和值集进行排序.


Cᴏʀ*_*ᴏʀʏ 5

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

 [4] => [Bob]
 [5] => [Mary, Sue]
 [9] => [Steve]
[10] => [Jason, Michelle]
Run Code Online (Sandbox Code Playgroud)

您必须稍微更改迭代器代码.您可以使用List元素的索引作为其"键",当然,您必须添加逻辑来初始化您Map的空列表或确保检查您的Mapnull.它将取决于你如何生成你的Map.