我想存储一个基于它们代表的值键入的对象集合。这些钥匙 能够 重复。例如:

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

从本质上讲,我想循环循环,然后查看每个钥匙,然后说:“是否有另一个对象(在这种情况下)在当前密钥中1键在1之内?如果是这样,请匹配它们并将其从集合中删除。 “我将在上面的示例中迭代“ 1”值,直到集合为空(或包含一个剩下的对象用于奇数场景)。

我不相信自己试图解决这是最好的方法,所以我也愿意接受反馈。

有帮助吗?

解决方案

你想要一个 多图像. 瓜瓦 提供此接口和各种子接口,例如 ListMultimap, SetMultimapSortedSetMultimap 取决于您希望将值存储在哪种藏品中。然后,它提供了各种实现,例如 ArrayListMultimapHashMultimap, ,加上各种供应 多图.

在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, , ETC。

我不确定您的意思是“还有另一个对象,其键位于当前密钥中的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 使用空列表或确保检查您的 Mapnull. 。这将取决于您如何生成 Map.

那这样的事情呢:

IDictionary<int,IList<Person>> 

我必须管理,我不会100%遵循业务逻辑,但是如果您可以为单个密钥具有多个值,那么类似的东西应该支持它。

- 编辑 - 忽略这一点 - 向我指出,这被标记为Java问题。因此,与:

Map<Integer, List<String>>

更合适。

也许只有类似的内容:列表自定义对象具有您的密钥和值,然后按密钥对列表进行排序。

由于听起来您正在按顺序处理它们,因此我认为地图可能过于杀伤,因为您想按键迭代键并成对删除项目。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top