在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");
您可以通过键入将Object
为Map
或HashMap
。
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提供了几个实用程序类,如Lists
, Iterables
, Maps
等,可以让您从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
那么“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+