新数组每个循环迭代

时间:2016-07-04 10:49:13

标签: java arrays

我需要在循环的每次迭代中声明一个新数组,我知道我可以通过以下方式实现:

//Store mappings from array name (String) to int arrays (int[])
Map<String, int[]> namedArrays = new HashMap<String, int[]>();
for (int i = 0; i < 3; i++)
{
  //This is going to be the name of your new array
  String arrayName = String.valueOf(i); 
  //Map an new int[] to this name
  namedArrays.put(arrayName, new int[3]);
}

//If you need to access array called "2" do
int[] array2 = namedArrays.get("2");

我的问题是在我声明一个新数组的部分,如果有一个已经命名为ai[]的数组,我可以像这样直接初始化它吗?:

namedArrays.put(arrayName,ai);

我尝试了这个但是我收到了一个错误。

编辑:现在我明白我实际上在检索数组时遇到了问题,我按照以下方式进行了初始化。

Map<String, int[]> namedArrays = new HashMap<String, int[]>();

        for(int i=0;i<testCase;i++){
            int num=scanner.nextInt();
            int[] ai=new int[num];
            for(int j=0;j<num;j++){
                ai[j]=scanner.nextInt();

            }
             String arrayName = String.valueOf(i); 

             namedArrays.put(arrayName,ai);

我试图通过以下方式检索它

for(int i=0;i<testCase;i++){
            int[] array2 = namedArrays.get(i);

array2包含的值类似于&#34; [I @ 1fc4bec&#34;。但它应该包含一个数组。

编辑2:我明白我可以通过以下方式获取数组

String arrayName = String.valueOf(i); 
            // System.out.println(namedArrays.get(arrayName)[0]);
            int b=namedArrays.get(arrayName).length;
            int[] array2=new int[b];
            for(int z=0;z<b;z++){
            array2[z] = namedArrays.get(arrayName)[z];}

但是你确实

array2[z] = namedArrays.get(arrayName)

返回&#34; [我@ 1fc4bec&#34; ?

5 个答案:

答案 0 :(得分:1)

来自javadoc

  

将指定的值与此映射中的指定键相关联(可选操作)。如果映射先前包含键的映射,则旧值将替换为指定的值。

所以答案是肯定的,如果你知道密钥,你可以明确地放置一个对象。 如果它们已经存在,则替换值,否则添加。

尝试使用以下代码:

String arrayName = "1";   // Any not null string works here
int[] ai = new int[0];    // any valid int[] works here
namedArrays.put(arrayName, ai);

答案 1 :(得分:1)

  

我的问题是在我声明一个新数组的部分,如果有一个数组已经命名为ai [],我可以像这样直接初始化吗?

你可以按照你的要求去做,但它不会像你期望的那样工作。将数组传递给该函数时,实际上每次都会将引用传递给同一个数组。这意味着如果你得到链接到名称“1”的数组并修改它,你也将修改数组为“2”和“3”,依此类推。

  

array2包含类似“[I @ 1fc4bec”的值。但它应该包含一个数组。

所以,这里发生的事情是你做过类似的事情

int[] array2 = namedArrays.get(i);
System.out.println(array2);

问题是System.out.println()接受String参数,而int []不是字符串。为了解决这个问题,Java会在将数组传递给真正的打印函数之前调用数组toString()。它看起来像这样:

public void println(int[] toPrint) {
    println("[I@" + Integer.toHexString(toPrint.hashCode()));
}

而且,实际上,如果你用"[I@" + Integer.toHexString(array2.hashCode()写出那条确切的行,你会注意到它的打印效果与打印array2本身完全相同。

对于"[I"位,实际上是Java程序集告诉你对象的类型。 [表示它是一个数组,I表示它是一个整数。

如果要打印数组的内容,则应使用System.out.println(Arrays.toString(array2))Arrays.toString(int[])将整数数组的内容转换为可以打印的格式良好的字符串。

最后一件事
您似乎基本上使用Map模拟2D数组。如果您只想要3个长度为3的数组,那么您可以编写

int[][] array2D = new int[3][3];

然后你可以像这样引用数组

System.out.println(array2D[1][2]);

将打印出第二个数组的第三个值(记住第0项是第一个项目。

这有一个额外的好处,你不必初始化数组的加载并调用`Map.put()',因为数组的元素都被初始化为它们的默认值(对于int, 0)。

答案 2 :(得分:0)

您的问题出在我声明新数组的部分,如果数组已经命名为ai[],该怎么办?

答案是。为什么不。如果已经ai[],那么您可以使用此ai[]变量初始化地图。但我会在初始化之前推荐一张支票。

if(ai == null) //if ai referring to null 
    ai = new int[3]; // initialize with Array size of 3

交叉检查天气是否初始化?进一步避免NullPointerException

//Store mappings from array name (String) to int arrays (int[])
Map<String, int[]> namedArrays = new HashMap<String, int[]>();
for (int i = 0; i < 3; i++)
{
  //This is going to be the name of your new array
  String arrayName = String.valueOf(i); 
  //Map an new int[] to this name
    if(ai == null) //if ai refering to null
       ai = new int[3];
  namedArrays.put(arrayName, ai);
}

//If you need to access array called "2" do
int[] array2 = namedArrays.get("2");

答案 3 :(得分:0)

所以你需要用空数组初始化一个地图。 尝试使用流 - 更少的代码,更易于阅读,更好的编译和JIT优化。

final Map<String, int[]> namedArrays = IntStream.range(0, 3)
            .boxed()
            .collect(Collectors.toMap(i -> String.valueOf(i), i -> new int[3]));

数组对象只是一个链接。您需要为每个映射条目声明一个新的。否则,地图中的所有键都将指向同一个数组。

答案 4 :(得分:-1)

Try This


dictionary<string,int> namesarrays=new dictionary<string,int>();






{


for (int i = 0; i < namesarrays.Length; i++)


    {


  string res = namedArrays[i];




        Response.Write("<script> alert('" + HttpUtility.HtmlEncode(res) + "'); 

</script>");


    }