HashMap to Array:抛出java.lang.ArrayStoreException

时间:2015-07-26 13:35:35

标签: java arrays hashmap

我应该将哈希转换为数组,但它会向我抛出一个java.lang.ArrayStoreException。我一步一步,试图看看我如何构建它,但它不会运行。

哈希:

{
    objectOne : {
        attributeOne : 1,
        attributeTwo : 2
    },
    objectTwo : {
        attributeOne : 3,
        attributeTwo : 4
    }
}

进入具有结构的数组:

[
    {
        name : 'objectOne',
        attributes : {
            attributeOne : 1,
            attributeTwo : 2
        }
    }, {
        name : 'objectTwo',
        attributes : {
            attributeOne : 3,
            attributeTwo : 4
        }
    }
]

我的代码抛出:

java.lang.ArrayStoreException: java.lang.String
    at java.util.AbstractCollection.toArray(AbstractCollection.java:171)
    at hashToArray2.main(hashToArray2.java:36)

我试图将参数更改为:

Object[] keys = map.keySet().toArray(new Object[map.size()][]));
Object[] values = map.values().toArray(new Object[map.size()][]));

但它会产生同样的问题。

代码:

public class hashToArray2{
    public static void main (String[] args) throws ClassNotFoundException{
        Class.forName("hashToArray2");
        System.out.println("hashToArray class successfully loaded");

        //Creating object1 + input values
        HashMap<String, Integer> obj1 = new HashMap<String, Integer>();
        obj1.put("attributeOne", 1);
        obj1.put("attributeTwo", 2);

        //Creating object2 + input values
        HashMap<String, Integer> obj2 = new HashMap<String, Integer>();
        obj2.put("attributeOne", 3);
        obj2.put("attributeTwo", 4);

        //Combining obj1+2
        //HashMap<String, Integer> map = new HashMap<String, Integer>();
        //map.putAll(obj1);
        //map.putAll(obj2);

        //to array
        Object[][] arr1 = new String[obj1.size()][2];
        Object[][] arr2 = new String[obj2.size()][2];
        //obj1
        Object[] keys1 = obj1.keySet().toArray(new Object[obj1.size()][]);
        Object[] values1 = obj1.values().toArray(new Object[obj1.size()][]);

        for(int i = 0; i < arr1.length; i++){
            arr1[i][0] = keys1[i];
            arr1[i][1] = values1[i];
        }

        for(int j = 0; j < arr1.length; j++){
            for(int k = 0; k < arr1[j].length; k++){
                System.out.println(arr1[j][k]);
            }
        }

        //obj2
        Object[] keys2 = obj2.keySet().toArray(new Object[obj2.size()][]);
        Object[] values2 = obj2.values().toArray(new Object[obj2.size()][]);

        for(int a = 0; a < arr2.length; a++){
            arr2[a][0] = keys2[a];
            arr2[a][1] = values2[a];
        }

        for(int b = 0; b < arr2.length; b++){
            for(int c = 0; c < arr2[b].length; c++){
                System.out.println(arr2[b][c]);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

异常是由这行代码引起的:

Object[] keys1 = obj1.keySet().toArray(new Object[obj1.size()][]);

那么,它在做什么:它在toArray(T[])上调用Set<String>toArray()将数组作为参数,并将该集合的所有值(在本例中为String实例)存储在该数组中。但是你传递new Object[obj1.size()][]作为参数,即Object[]的数组,即一组对象数组。字符串不是Object[],因此是错误。

我真的不知道你要做什么,因为你的描述确实与代码不符。我所知道的是,你的代码正在寻找带有属性的自定义类,而不是地图和数组。

答案 1 :(得分:0)

我不喜欢发布代码,但我认为这就是你想要的。

List<Map> list = new ArrayList<>();
for(Map.Entry<String, Integer> entry : hashes.entrySet()) {
    Map newMap = new HashMap();
    newMap.put("name", entry.getKey());
    newMap.put("attributes", entry.getValue());

    list.add(newMap);
}