在我当前的项目中,我需要以下类型的数据结构
Map<String, Map<String,Set<String>>, Set<subscriber>>
据我所知,Java 不支持这种数据结构(如果我错了,请纠正我)。或者(你可以建议我“如何在 Java 中实现这种数据类型的数据结构)。
是否有任何第三方库支持上述数据结构和操作?
地图是一个key/value
对象,所以你不能有一个Map<String, Map, Set>
开始。
一个可能的解决方案是创建一个对象来容纳您的所有信息,然后制作一个带有键String
和值的 MapCustomObject
Java 不提供简单的“Pair”类,因此您需要编写一个包装类并在 Map 中使用它:
class Wrapper {
public Map<String,Set<String>> myMap = new HashMap<String,Set<String>>();
public Set<Subscriber> mySet = new TreeSet<Subscriber>();
}
Map <String, Wrapper> myMapOfWrappers = new HashMap<String, Wrapper>();
(Wrapper
这里的类是一个简单的例子,你可以根据你的用例提供getter/setter等)
编辑添加:在我发布此内容的同时,您在问题下添加了评论。即使您接受它作为答案,您的评论说您正在寻找两个 key。你可能想重新考虑你是如何解决这个问题的。亚历克斯在他的例子中展示了你必须如何做到这一点。如果内容发生变化,使用可变数据作为 a 中的键Map
会导致很多问题,而这正是他的所有代码所阻止的。实施equals()
andhashCode()
来防止这种情况通常并非易事。
If you really want maps to act as keys in your data structure, then I think this is what you want:
static Map<String,Set<String>> makeUnmodifiable(Map<String,Set<String>> m) {
Map<String,Set<String>> map = new HashMap<String,Set<String>>();
for (Map.Entry<String,Set<String>> entry : m.entrySet()) {
map.add(entry.getKey(), Collections.unmodifiableSet(entry.getValue()));
}
return Collections.unmodifiableMap(map);
}
static class Pair {
final String first;
final Map<String,Set<String>> second;
Pair(String first, Map<String,Set<String>> second) {
this.first = first;
this.second = second != null ? makeUnmodifiable(second) : null;
}
public void equals(Object o) {
...
}
public int hashCode() {
...
}
}
Map<Pair,Set<Subscriber>> myMap;
Note that you MUST override equals and hashCode in the custom Pair class in order for this to work properly.
为什么不:
Map<String, Object[]>
然后创建一个 2 长度的对象数组来保存你的Map<String,Set<String>>
和Set<subscriber>
这有点骇人听闻,但这是一个解决方案
编辑:我喜欢自定义对象的想法,更好,更安全!