0

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

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

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

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

4

5 回答 5

4

地图是一个key/value对象,所以你不能有一个Map<String, Map, Set>开始。

于 2012-04-20T14:07:41.597 回答
4

一个可能的解决方案是创建一个对象来容纳您的所有信息,然后制作一个带有键String和值的 MapCustomObject

于 2012-04-20T14:08:30.810 回答
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等)

编辑添加:在我发布此内容的同时,您在问题下添加了评论。即使您接受它作为答案,您的评论说您正在寻找两个 key。你可能想重新考虑你是如何解决这个问题的。亚历克斯在他的例子中展示了你必须如何做到这一点。如果内容发生变化,使用可变数据作为 a 中的键Map会导致很多问题,而这正是他的所有代码所阻止的。实施equals()andhashCode()来防止这种情况通常并非易事。

于 2012-04-20T14:12:11.577 回答
2

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.

于 2012-04-20T14:20:36.793 回答
1

为什么不:

Map<String, Object[]>

然后创建一个 2 长度的对象数组来保存你的Map<String,Set<String>>Set<subscriber>

这有点骇人听闻,但这是一个解决方案

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

于 2012-04-20T14:09:43.637 回答