值被覆盖而不是添加

时间:2015-07-10 13:11:44

标签: java oop

列表中的值覆盖了我的程序。我想使用相同的对象来添加不同的值。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;

public class CommonValue {
    static int key = 100;

    public static void main(String[] args) throws IOException {
        HashMap<Integer, ArrayList<String>> map = new HashMap<Integer, ArrayList<String>>();
        ArrayList<String> list = new ArrayList<String>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StringBuffer sBuffer = new StringBuffer();
        Scanner scan = new Scanner(System.in);
        String choice = null;
        do {
            System.out.println("enter the how many element to add");
            int numOfElement = Integer.parseInt(reader.readLine());
            String userInput;
            int i = 0;
            do {
                // adding element in the list
                System.out.println("enter the element to add in the list");
                userInput = scan.next();
                list.add(userInput);
                i++;
            } while (i < numOfElement);
            // adding list in the map with key
            map.put(key, list);
            System.out.println(map);
            list.clear();
            // my intial key is 100 and it will incremented when i am going for another key
            key++;
            System.out.println("do you want to go for next key");
            System.out.println("y or n");
            choice = scan.next();

        } while (choice.equals("y"));
        for (Entry<Integer, ArrayList<String>> entry : map.entrySet()) {
            key = entry.getKey();
            ArrayList<String> value = entry.getValue();
            System.out.println("key" + entry.getKey() + ": value " + entry.getValue());
        }
    }
} 

输出:

  

输入要添加的元素数量   2
  输入要添加到列表中的元素
  一个
  输入要添加到列表中的元素
  X
  {100 = [a,x]}
  你想换下一个键吗?   y或n
  ÿ
  输入要添加的元素数量   1
  输入要添加到列表中的元素
  ž
  {100 = [z],101 = [z]}
  你想换下一个键吗?   y或n

实际上我需要的输出是:

  

{100 = [a,x],101 = [z]}

3 个答案:

答案 0 :(得分:6)

问题是您不断向List添加Map的同一个实例,而无需复制。这不起作用,因为清除地图外的列表也会清除地图中的列表 - 毕竟,它是同一个对象。

list.clear();替换为list = new ArrayList<String>();以解决此问题。

答案 1 :(得分:2)

您必须为List中的每个条目实例化一个新的HashMap。 目前,您要为每个条目添加完全相同的List实例。 结合list.clear(),这会产生观察到的输出。 (唯一!)列表中的最后一个条目将定义每个键的输出。

答案 2 :(得分:2)

亲爱的你在belove line犯了错误

list.clear();

而不是仅使用新实例再次初始化列表

list = new ArrayList<String>();