在我目前的项目中,我需要以下类型的数据结构
Map<String, Map<String,Set<String>>, Set<subscriber>>
据我所知,Java不支持这种数据结构(如果我错了,请纠正我)。或者(您可以建议我“如何在Java中实现此数据类型的数据结构)。
是否有任何第三方库,它支持上述数据结构和操作?
答案 0 :(得分:4)
地图是key/value
对象,因此您无法启动Map<String, Map, Set>
。
答案 1 :(得分:4)
一种可能的解决方案是创建一个对象来存储您的所有信息,然后制作一个包含密钥String
和值CustomObject
答案 2 :(得分:3)
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等)
编辑添加:您在我发布此内容的同时在您的问题下添加了评论。即使你接受它作为答案,你的评论说你正在寻找两个键。您可能想重新考虑如何解决问题。亚历克斯在他的例子中展示了你必须如何做到这一点。如果内容发生变化,使用可变数据作为Map
中的键可能会导致很多问题,而这正是他所有代码所阻止的。实施equals()
和hashCode()
以防止这种情况通常并非易事。
答案 3 :(得分:2)
如果您真的希望地图充当数据结构中的键,那么我认为这就是您想要的:
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;
请注意,您必须覆盖自定义Pair类中的equals和hashCode才能使其正常工作。
答案 4 :(得分:1)
为什么不:
Map<String, Object[]>
然后创建一个2长度的对象数组来保存Map<String,Set<String>>
和Set<subscriber>
这有点像黑客,但它是一个解决方案
编辑:我喜欢自定义对象的想法,更好,更安全!