在运行时向Object数组添加多个数据

时间:2013-05-15 05:49:42

标签: java for-loop

如何在java中为二维对象数组设置值。

以下是我的for循环:

Object[][] hexgenSecurityInferenceData = null;
for (String methodName: knowGoodMap.keySet()) {
    hexgenSecurityInferenceData = new Object[][] {
        {
            (KnownGoodInfoRO) knowGoodMap.get(methodName), new Object[] {
                (MethodPropertiesRO) methodPropertiesMap.get(methodName), (List) methodParametersMap.get(methodName)
            }
        },
    };
}

这只打印一行数据。我确信在adding values to Array of Object but really don't know how to fix.

时我犯了错误

请帮我解决这个问题

3 个答案:

答案 0 :(得分:4)

您不能元素添加到数组中 - 您只能在数组中设置元素。

我建议您改为List<Object[]>

List<Object[]> hexgenSecurityInferenceData = new ArrayList<Object[]>();
for (String methodName:knowGoodMap.keySet()) {
    hexgenSecurityInferenceData.add(new Object[] {
        knowGoodMap.get(methodName),
        new Object[] {
            methodPropertiesMap.get(methodName),
            methodParametersMap.get(methodName)
        }
     });
 }

(我删除了演员阵容,因为他们毫无意义......你无论如何都要将值存储在Object[]中。演员阵容的唯一好处就是如果对象属于意外的类型。)

如果你真的想要可以仍然使用数组,但是你需要创建一个合适的大小来开始,然后保留“当前索引”。然后,通常使用数组而不是列表更难。

如果你真的需要一个数组,你可以从列表中创建一个:

Object[][] array = hexgenSecurityInferenceData.toArray(new Object[0][]);

以这种方式分两个阶段完成它比直接在前面填充数组更简单。

我实际上建议进行两项进一步的修改:

  • 不要只为此使用Object[] ...创建一个类型来封装此数据。使用您当前的方法,您甚至在Object[]内有一个嵌套的Object[] ...任何代码读取这些数据都会非常糟糕。
  • 使用entrySet()代替keySet(),然后您无需按键获取值

答案 1 :(得分:1)

你有一个对象矩阵Object[][]所以如果你想填充这个二维数组,你必须做类似的事情:

Object[][] hexgenSecurityInferenceData=new Object[10][10];
for(int i=0; i<10;i++){
   for(int j=0; j<10;j++){
        hexgenSecurityInferenceData[i][j] = new Object();
   }
}

以及 Jon 指出,更好地拥有自己的实现/封装而非使用Object

答案 2 :(得分:1)

使用List是解决此问题的最佳方法。但是,您仍然可以通过初始化数组来使用object[]

Object[][] hexgenSecurityInferenceData = new Object[knowGoodMap.keySet().size()][];
int i = 0;
for (String methodName : knowGoodMap.keySet()) 
{
  hexgenSecurityInferenceData[i][0] = new Object[][]
  {
     {(KnownGoodInfoRO) knowGoodMap.get(methodName), 
         new Object[]{(MethodPropertiesRO) methodPropertiesMap.get(methodName), (List) methodParametersMap.get(methodName)}
     }
  };
   i++;
 }