2017-06-01 79 views
1

我想重新包含一个包含字符串作为关键字和一个集合作为一个值的地图,我应该怎么做呢?这是我得到的。如何声明和初始化包含HashSet的HashMap

/** 
* 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>(); 
    } 
} 

这是行不通的,我看了一些类似的问题,但我找不到解决方案。

感谢您的帮助!

+0

*这是行不通的*:你可以描述它是什么意思? – Jens

+1

'aCatalog = new HashMap >();' – Eran

+0

它不会编译,在声明 私有HashMap 变种> aCatalog; – curiousBadger

回答

3

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

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

由于Java 1.7,你可以使用钻石操作:

aCatalog = new HashMap<>(); 

为了把一个值到您的地图,你需要初始化设定:

aCatalog.put("theKey", varieties); 
+0

我不能编译为声明, 'private HashMap variety> aCatalog;' 它说设置 * HERE *品种之间有错误。IDE要求“>” – curiousBadger

+0

从通用声明 –

+0

中删除'品种'然后编译,但是我需要添加'私有HashSet 变种;'作为第二个声明 – curiousBadger

0

你可以这样做:

// 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>()); 
0

自己不这样做,有美丽Multimap by Google Guava这是做你想要的。 要初始化,您可以使用制造商这样的:

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

希望它能帮助!

+0

我很乐意,不幸的是我们不允许这样的魔法考试! – curiousBadger

0

这是不正确的声明:

private HashMap <String , Set<String> varieties> aCatalog; 
//---------------------------------------------^ 

应该:

private HashMap <String , Set<String>> aCatalog, varieties; 
//-----------------------------------^---------^ 

或单独声明它们

private HashMap<String, Set<String>> aCatalog; 
private HashMap<String, Set<String>> varieties; 

要inisliaze你的地图,你必须使用:

aCatalog = new HashMap<>(); 

但我想你想是这样的:

private HashMap<String, Set<String>> aCatalog;//declare the HashMap 
private Set<String> varieties;//declare the HashSet 
//-------^^^ 

public Catalog() { 
    // initialise instance variables 
    varieties = new HashSet<>();//insialize the HashSet 
    aCatalog = new HashMap<>();//Inisialize the HashMap 

    //put some values to your Map 
    aCatalog.put("key", varieties); 
    //----------------------^^ 
} 
0

欧凯,你有同类型的变量的问题,您是在混淆如何初始化你的对象,这里是双向的,以这样做:

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); 


    } 
} 
+0

'aCatalog'的声明不会编译,因为通用零件中的''品种' –

+0

@Stefan Warminski你很对,非常感谢你,我更新了答案,希望现在是正确的 –

+0

@Damian Lattenero我不需要命名该集合? as'varieties = new HashSet ();'你还错过了一个“>”'aCatalog = new HashMap >();' – curiousBadger