import java.util.*;
import java.lang.*;
import java.io.*;
/*In this question i am modifying the array in every step
and adding them to hashmap.
But after debugging i found out that hashmap is
containing only the last modified array. */
class Solution
{
public static void main (String[] args) throws java.lang.Exception
{
Scanner sc=new Scanner(System.in);
int t=sc.nextInt(); /*Testcases*/
while(t-->0) /*Iterating t times */
{
/*Size of array*/
int n=sc.nextInt();
long k=sc.nextLong();
/*Creating a hashmap*/
Integer arr[]=new Integer[n]; //Initialising the array arr
HashMap<Integer,List<Integer>> map=new HashMap<>();
/*Input array elements*/
for(int i=0;i<n;i++)
{
arr[i]=sc.nextInt();
}
/*Converting array to list*/
List<Integer> list=Arrays.asList(arr);
/*Inserting values to hashmap*/
map.put(0,list);
/*for debugging purpose*/
System.out.println(map);
/*mid value of array*/
int midvalue=arr[(0+(n/2))];
/*In this step i am modifying the array in every step
and adding them to hashmap.
But after debugging i found out that hashmap is
containing only the last modified array. */
for(int i=0;i<n*3-1;i++)
{
/*Performing some operations on array*/
int a=arr[(i%n)];
int b=arr[(n-(i%n)-1)];
int c=a^b;
arr[i%n]=c;
/*When array is changed,we convert that array to list and store it into map*/
List<Integer> k1=Arrays.asList(arr);
System.out.println(k1); /*for debugging*/
map.put(i+1,k1); //storing the new modified array to map
}
/*debugging*/
System.out.println(map);
}
}
}
我也尝试使用Collections.addAll方法。尽管此方法有效,但它在我的代码中给了我TLE。所以我不想使用这种方法
for(int i=0;i<n*3-1;i++)
{
int a=arr[((i%n))];
int b=arr[(n-(i%n)-1)];
int c=a^b;
arr[i%n]=c;
List<Integer> k1=new ArrayList<>();
Collections.addAll(k1,arr);
map.put(i+1,k1);
}
预期结果:{0 = [3,7],1 = [4,7],2 = [4,3],3 = [7,3],4 = [7,4],5 = [ 3,4]}
实际结果:{0 = [3,4],1 = [3,4],2 = [3,4],3 = [3,4],4 = [3,4],5 = [ 3,4]}
答案 0 :(得分:0)
尝试更改您的代码
List<Integer> k1=Arrays.asList(arr);
对此。
List<Integer> k1 = new ArrayList<>(Arrays.asList(arr));
或者像这样
Integer[] newInteger = arr.clone();
List<Integer> k1 = Arrays.asList(newInteger);
为什么地图仅包含最后修改的列表?
回答您的问题。
因为哈希映射只是将引用添加到哈希映射,所以指向同一列表。如果清除一个列表,它将清除所有其他列表;如果更新一个列表,则将更新所有其他列表。尝试谷歌“通过引用传递,并通过值传递Java”。
答案 1 :(得分:-1)
在循环的每次迭代中,您都创建了一个新的Integer数组,List和Hashmap对象。将对象的创建带出循环。