【问题标题】:How to declare & Initialize a HashMap that Contains A HashSet如何声明和初始化包含 HashSet 的 HashMap
【发布时间】:2017-06-01 13:03:39
【问题描述】:

我正在尝试读取包含作为键的字符串和作为值的集合的 Map,我应该如何处理?这就是我得到的。

/**
 * A Class
 */
public class Catalog
{  
   private HashMap <String , Set<String> varieties> aCatalog;

   /**
    * Constructor for objects of class Catalog
    */
   public Catalog()
   {
      // initialise instance variables
      varieties = new HashSet<>();
      aCatalog = new HashMap<String,varieties>();
   }
}

这不起作用,我查看了一些类似的问题,但找不到解决方案。

感谢大家的帮助!

【问题讨论】:

  • 这不起作用:你能描述一下它的含义吗?
  • aCatalog = new HashMap&lt;String,Set&lt;String&gt;&gt;();
  • 它不会编译,在声明 private HashMap variables> aCatalog;

标签: java hashmap initialization declaration hashset


【解决方案1】:

要初始化您的地图,您只需要定义泛型类型:

aCatalog = new HashMap<String, Set<String>>();

从 java 1.7 开始,您可以使用菱形运算符:

aCatalog = new HashMap<>();

要将值放入您的地图中,您需要初始化一个集合:

aCatalog.put("theKey", varieties);

【讨论】:

  • 我无法编译为声明,private HashMap &lt;String , Set&lt;String&gt; varieties&gt; aCatalog; 它表示 Set*HERE*varieties 之间存在错误。 IDE 要求 ">"
  • 从通用声明中删除 varieties
  • 然后编译,但我需要添加private HashSet &lt;String&gt; varieties; 作为第二个声明
  • 更改后的答案将varieties 放到地图上
  • private Map&lt;String, Set&lt;String&gt;&gt; aCatalog; 无法编译,“找不到符号 - 类映射”
【解决方案2】:

你可以这样做:

    // declare:
    Map<String, Set<String>> aCatalog;
    // init java 7
    aCatalog = new HashMap<>();
    // insert:
    aCatalog.put("AA", new HashSet<>());

或在旧版本中:

    // declare:
    Map<String, Set<String>> aCatalog;
    // init java  
    aCatalog = new HashMap<String, Set<String>>();
    // insert:
    aCatalog.put("AA", new HashSet<String>());

【讨论】:

    【解决方案3】:

    不要自己做,有漂亮的Multimap by Google Guava 就是你想做的。 要初始化,您可以像这样使用构建器:

    SetMultimap<String, String> yourMap = MultimapBuilder.hashKeys()
             .linkedHashSetValues().build();
    

    希望对你有帮助!

    【讨论】:

    • 我很乐意,不幸的是,我的考试不允许我们使用这种魔法!
    【解决方案4】:

    好吧,你的变量类型有问题,你对如何初始化你的对象感到困惑,这里有两种方法:

    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Map;
    import java.util.Set;
    
    public class Catalog {
    
        //is better to use interface for the type of the variable
        private Map<String, Set<String>> aCatalog;
    
        // here in your constructor, you just initialize an empty Hash, the most
        // external one
        public Catalog() {
            aCatalog = new HashMap<String, Set<String>>();
            // aCatalog = new HashMap<>(); //this is also valid since 1.7
        }
    
        //you can also create another constructor, and create the map outside and give it as parameter
        public Catalog(Map<String, Set<String>> catalog) {
            this.aCatalog = catalog;
        }
    
    
    
        public Map<String, Set<String>> getaCatalog() {
            return aCatalog;
        }
    
    
        public static void main(String[] args) {
            //here is an example of creating the map inside the Catalog class
            Catalog catalog1 = new Catalog();
    
            String key1 = "k1";
            Set<String> valueSet1 = new HashSet<String>();
            valueSet1.add("something 1");
            valueSet1.add("something 2");
            valueSet1.add("something 3");
            String key2 = "k2";
            Set<String> valueSet2 = new HashSet<String>();
            valueSet2.add("other thing1");
            valueSet2.add("other thing2");
            valueSet2.add("other thing3");
    
            catalog1.getaCatalog().put(key1, valueSet1);
            catalog1.getaCatalog().put(key2, valueSet2);
    
            //and here is an example of givin as constructor parameter
    
            Map<String, Set<String>> anotherCatalog = new HashMap<>();
            anotherCatalog.put(key1, valueSet2);
            anotherCatalog.put(key2, valueSet1);
    
            Catalog catalog2 = new Catalog(anotherCatalog);
    
    
        }
    }
    

    【讨论】:

    • aCatalog 的声明由于泛型部分中的varieties 而无法编译
    • @Stefan Warminski 你说的太对了,非常感谢,我更新了答案,希望现在是正确的
    • @Damian Lattenero 我不需要命名这个集合吗? asvarieties = new HashSet&lt;String&gt;(); 你也错过了一个“>”aCatalog = new HashMap&lt;String , Set&lt;String&gt;&gt;();
    • @curiousBadger 我用两个示例更新了答案,以便您可以测试代码!我希望这会有所帮助
    • @curiousBadger 如果答案有用,别忘了用(✓)符号接受它,你可以只接受一个答案。希望有所帮助!
    猜你喜欢
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    相关资源
    最近更新 更多