我每次迭代都将修改后的arraylist存储在map中,那么为什么map仅包含最后一个修改后的列表?

时间:2019-10-13 17:01:20

标签: java arrays debugging arraylist hashmap

    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]}

2 个答案:

答案 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对象。将对象的创建带出循环。