用Java映射和设置

时间:2012-04-20 14:06:04

标签: java hashmap set hashtable

在我目前的项目中,我需要以下类型的数据结构

Map<String, Map<String,Set<String>>, Set<subscriber>> 

据我所知,Java不支持这种数据结构(如果我错了,请纠正我)。或者(您可以建议我“如何在Java中实现此数据类型的数据结构)。

是否有任何第三方库,它支持上述数据结构和操作?

5 个答案:

答案 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>

这有点像黑客,但它是一个解决方案

编辑:我喜欢自定义对象的想法,更好,更安全!