我需要在循环的每次迭代中声明一个新数组,我知道我可以通过以下方式实现:
//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; ?
答案 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>");
}