我想要哪种Java对象类型(Collection/list/set/erath)?
-
30-09-2019 - |
题
我想存储一个基于它们代表的值键入的对象集合。这些钥匙 能够 重复。例如:
[4] => Bob
[5] => Mary
[5] => Sue
[9] => Steve
[10] => Jason
[10] => Michelle
从本质上讲,我想循环循环,然后查看每个钥匙,然后说:“是否有另一个对象(在这种情况下)在当前密钥中1键在1之内?如果是这样,请匹配它们并将其从集合中删除。 “我将在上面的示例中迭代“ 1”值,直到集合为空(或包含一个剩下的对象用于奇数场景)。
我不相信自己试图解决这是最好的方法,所以我也愿意接受反馈。
解决方案
你想要一个 多图像. 瓜瓦 提供此接口和各种子接口,例如 ListMultimap
, SetMultimap
和 SortedSetMultimap
取决于您希望将值存储在哪种藏品中。然后,它提供了各种实现,例如 ArrayListMultimap
和 HashMultimap
, ,加上各种供应 多图.
在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
使用空列表或确保检查您的 Map
值 null
. 。这将取决于您如何生成 Map
.
那这样的事情呢:
IDictionary<int,IList<Person>>
我必须管理,我不会100%遵循业务逻辑,但是如果您可以为单个密钥具有多个值,那么类似的东西应该支持它。
- 编辑 - 忽略这一点 - 向我指出,这被标记为Java问题。因此,与:
Map<Integer, List<String>>
更合适。
也许只有类似的内容:列表自定义对象具有您的密钥和值,然后按密钥对列表进行排序。
由于听起来您正在按顺序处理它们,因此我认为地图可能过于杀伤,因为您想按键迭代键并成对删除项目。