在hashmap里面的arraylist中添加元素

时间:2015-01-21 14:44:45

标签: java json arraylist hashmap

我正在尝试动态构建String和arraylist类型的动态哈希映射。我有一些来自服务器的json数据,而不是声明许多arraylist,我想将它们保存在hashmap中,其中String为键,arraylist为value。

这是我现在正在做的事情

public ArrayList<classproperty> allStu;
public ArrayList<classproperty> allEmp;
public HashMap<String, ArrayList<classproperty>> hash
  if (type.equals("Student")) {
      prop = new classproperty("Student", info.getJSONObject(i).getJSONObject("student").getJSONArray("class").getJSONObject(s).getJSONObject("type").getString("name"))
                            allStu.add(prop);       
                        }
 if (type.equals("Emp")) {
  prop = new esSignalProperty("Emp", info.getJSONObject(m).getJSONObject("emp").getJSONObject(s).getJSONObject("dept").getString("name"))
      allemp.add(prop)         
        }
   }
      hash.put("Student", allStu);
           hash.put("Emp", allemp);

这样做是丑陋的方式......我想通过直接放入hashmap而不声明这么多的arraylist来做到这一点。请忽略json字符串提取,因为它只是虚拟。

3 个答案:

答案 0 :(得分:1)

hash.get("Student").put(prop)

可能是一个解决方案,因为您知道地图中的密钥。

使用这种方式,您可以省略'allStu'和'allEmp'列表,因为您可以直接从地图中获取它们。

答案 1 :(得分:1)

我建议使用已经支持此功能的Guava库中的MultiMap。如果您不打算导入此库,那么您可以手动滚动自己作为Map<K, List<V>>的包装:

//basic skeleton of the multimap
//as a wrapper of a map
//you can define more methods as you want/need
public class MyMultiMap<K,V> {
    Map<K, List<V>> map;
    public MyMultiMap() {
        map = new HashMap<K, List<V>>();
    }

    //in case client needs to use another kind of Map for implementation
    //e.g. ConcurrentHashMap
    public MyMultiMap(Map<K, List<V>> map) {
        this.map = map;
    }

    public void put(K key, V value) {
        List<V> values = map.get(key);
        if (values == null) {
            //ensure that there will always be a List
            //for any key/value to be inserted
            values = new ArrayList<V>();
            map.put(key, values);
        }
        values.add(value);
    }

    public List<V> get(K key) {
        return map.get(key);
    }

    @Override
    public String toString() {
        //naive toString implementation
        return map.toString();
    }
}

然后只使用你的multimap:

MyMultiMap myMultiMap = new MyMultiMap<String, ClassProperty>();
myMultiMap.put("student", new ClassProperty(...));
myMultiMap.put("student", new ClassProperty(...));
System.out.println(myMultiMap);

答案 2 :(得分:1)

您只需要在开头初始化arraylist,然后只需根据键添加值。如果你知道我猜你知道你可以这样做的钥匙

public HashMap<String, ArrayList<classproperty>> hash
hash.put("Student", new ArrayList<classproperty>());
hash.put("Emp", new ArrayList<classproperty>());

就像@steffen提到但稍微改变一样

  hash.get("Student").add(prop);
  hash.get("Emp").add(prop);

与其他目的没有什么不同,但可能仍然有帮助。