2011-12-05 93 views
0

说我有这样的定义包含HashMap的一个HashMap:如何在泛型中定义泛型?

hashMap = new HashMap<String, HashMap<String, Integer>>(); 

我怎么会抽象了本作的定义更加清晰?

+1

你能解释一下什么是不太清楚呢? – mdma

+0

你能详细说明你正在努力完成什么吗? –

+0

你想更清楚些什么? – srchulo

回答

2

如果我正确地解释你的问题,你有一个将对象映射在一起的集合,并想知道是否有办法做到更好。

这是最好的,如果我们定义每个元素的目的,所以作为一个例子:

Map<String,  // ZIP code (e.g. 6009) 
    Map<String, // Name  (e.g. John Smith) 
     Integer>> // Age  (e.g. 42) 

在这种情况下,您可以创建下面的类:

class Person { 
    private String name; 
    private Integer age; 

    // Constructor and getters etc. 
} 

这简化了您的收集到:

Map<String,   // ZIP/Postal code 
    List<Person>> // List of people in this postal code. 

然后你可以进一步简化它,如果你想,但这会给你一个想要采取什么步骤的想法。最重要的是使用有意义的名称。

+0

好主意,但不会'地图<邮编,地图>'更好吗? – emory

+0

@emory这绝对易于理解,但引入了名称都是需要的类型。使用描述性对象Person来模拟实体之间的映射是我试图展示的主要观点。地图地图(可以说)在概念上更困难。 – Bringer128

0

您可以创建一个抽象工厂类。通常这些对于以通用方式为具体类型创建抽象包装很有用。工厂也常常以单身形式实施。

2

,如果你不希望有再次重复定义,你可以把它的一类,定义不明确,只是罗嗦..

class HashBrowns : HashMap<String, HashMap<String, Integer>> 
0

不了解更多关于您的具体情况,可以推荐的最佳方法是抽象出存储方法的一些方法。

例如:

public Integer getNumber(String name, String attribute) 
{ 
    HashMap<String,Integer> subMap = hashMap.get(name); 
    if (subMap != null) 
    { 
     return subMap.get(attribute); 
    } else 
    { 
     return null; 
    } 
} 

public void setNumber(String name, String attribute, Integer number) 
{ 
    HashMap<String,Integer> subMap = hashMap.get(name); 
    if (subMap == null) 
    { 
     subMap = new HashMap<String,Integer>(); 
     hashMap.put(name,subMap); 
    } 

    subMap.put(attribute,number); 
}