在Java中创建复杂的HashMap

这样创建HashMap的最简单方法是什么:

( student1 => Map( name => Tim, Scores => Map( math => 10, physics => 20, Computers => 30), place => Miami, ranking => Array(2,8,1,13), ), student2 => Map ( ............... ............... ), ............................ ............................ ); 

我试过这个:

 HashMap record = new HashMap(); record.put("student1", new HashMap()); record.get("student1").put("name","Tim"); record.get("student1").put("Scores", new HashMap()); 

但我得到错误。 我这样做是因为, record.get("student1")是一个HashMap对象,所以我假设一个put应该可以工作,依此类推。

如果它不起作用,最好的方法是什么?

您得到该exception,因为get()返回一个Object类型。 你需要把它投射到Map

 ((Map)record.get("student1")).put("name","Tim"); 

您可以通过键入将ObjectMapHashMap

 HashMap record = new HashMap(); record.put("student1", new HashMap()); ((HashMap)record.get("student1")).put("name","Tim"); ((HashMap)record.get("student1")).put("Scores", new HashMap()); 

不过,正如我评论的那样,你确定要这个设计吗?

Java是一种静态和名义上键入的语言。 因此,您所遵循的编码风格并不可取。 您应该创建类和对象。

也就是说,Guava提供了几个实用程序类,如ListsIterablesMaps等,可以让您从varargs构造相关的集合对象。

虽然我同意其他评论者更喜欢为您的域对象创建适当的类,但我们可以使用一些辅助方法简化映射构造语法:

 Map map = map( entry("student1", map( entry("name", "Tim"), entry("scores", map( entry("math", 10), entry("physics", 20), entry("Computers", 30) )), entry("place", "Miami"), entry("ranking", array(2, 8, 1, 13)) )), entry("student2", map( // ... )) ); // map.toString(): // {student2={}, student1={scores={math=10, physics=20, Computers=30}, name=Tim, place=Miami, ranking=[2, 8, 1, 13]}} 

您只需要定义一个如下所示的辅助类,并使用静态导入:

 import static com.example.MapHelper.*; 

助手类:

 package com.example; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MapHelper { public static class Entry { private String key; private Object value; public Entry(String key, Object value) { this.key = key; this.value = value; } public String getKey() { return key; } public Object getValue() { return value; } } public static Map map(Entry... entries) { Map map = new HashMap(); for (Entry e : entries) { map.put(e.getKey(), e.getValue()); } return map; } public static Entry entry(String k, Object v) { return new Entry(k, v); } public static List array(Object... items) { List list = new ArrayList(items.length); for (int i = 0; i < items.length; i++) { list.add(i, items[i]); } return list; } } 

那么“Java”方法就是将这些实体分解为类。 从您给出的示例中,您可以创建一个包含名称,位置,位置等属性的Student类。

这比将所有东西强制进入这样的地图要清晰得多。

为什么要创建一组复杂的HashMaps,您可以改为创建Java对象,然后将其用于HashMap。

因此,在您的情况下,您可以创建一个名为ScoreInfo的类,它将具有HashMap得分,位置和排名,然后将其用作HashMap的值。

更换

 HashMap record = new HashMap(); 

 Map> record = new HashMap>(); 

但是,将不同的对象类型作为值放置没有多大意义。 如果以下行是错误的,

 record.get("student1").put("Scores", new HashMap()); 

那么你也可以简化定义。

 Map record = new HashMap(); 

假设:您使用的是JDK 1.5+