【问题标题】:Map and Set in JavaJava中的映射和设置
【发布时间】:2012-04-20 14:06:04
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你能多描述一下你想要这个数据结构做什么吗? map 有键有值,那么第三个参数是什么?
  • 地图>, Set>。这意味着数据结构是多值的。前两个参数是键。
  • 如果您描述您的功能需求会更好,问题似乎出在您尝试做的设计中

标签: java hashmap set hashtable


【解决方案1】:

地图是一个key/value 对象,因此您不能从Map&lt;String, Map, Set&gt; 开始。

【讨论】:

  • 这就是OP所说的据我所知,Java不支持这种数据结构
【解决方案2】:

一种可能的解决方案是创建一个对象来存放您的所有信息,然后使用键 String 和值 CustomObject 制作一个 Map

【讨论】:

    【解决方案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() 来防止这种情况通常并非易事。

    【讨论】:

    • 哦,投票者,请分享您的智慧。 (显然有人在网上受伤)
    • 同意,您想在另一个地图中使用地图作为键这一事实非常不寻常,这似乎表明您可能没有完全理解问题空间,或者正在混淆一些不相关的想法。也许你最好把它整理成两张地图或类似的东西。
    【解决方案4】:

    如果您真的希望地图充当数据结构中的键,那么我认为这就是您想要的:

    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 才能使其正常工作。

    【讨论】:

    • 天哪,不,不是。即使覆盖 equals()hashCode(),使用可变对象作为 Map 中的键也是一个非常糟糕的主意。
    • Alex - 他在事后发表了关于两个键的评论,我没有看到它。您的修改使这好多更好;请参阅我添加到答案中的注释。
    【解决方案5】:

    为什么不:

    Map<String, Object[]>
    

    然后创建一个长度为 2 的对象数组来保存您的 Map&lt;String,Set&lt;String&gt;&gt;Set&lt;subscriber&gt;

    这有点小技巧,但它是一个解决方案

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

    【讨论】:

    • 在那里打字没有帮助。为什么不使用 pair-type 类型,无论是通用的还是为此目的定制的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多