替换Hashmap中包含每个键多个值的值

时间:2015-10-21 21:12:58

标签: java hashmap

我需要一些帮助来替换HashMap中的值。 HashMap包含每个键的多个值,这些值是从ArrayList添加的。我想要做的是替换密钥中的元素。例如,用户输入键1和索引2,这将是该键的值[1] = [A,B,C,D],索引2将是字母" C"我想用一个" X"因此输出将是[1] = [A,B,X,D],这将在while循环内。

 HashMap<String, List<String>> seatMap = new HashMap<String, List<String>>();

 seats.add("A");
 seats.add("B");
 seats.add("C");
 seats.add("D");

String k = null;     
for(int i=1; i<8;i++){
     k = Integer.toString(i);
     seatMap.put(k, seats);
}

 for(Map.Entry<String, List<String>> entry : seatMap.entrySet()){
     String key= entry.getKey();
     List<String> values = entry.getValue();
     System.out.println(key+"  "+values.get(0)+values.get(1)+"  "+values.get(2)+values.get(3));
 }

输出:

  • 1 AB CD
  • 2 AB CD
  • 3 AB CD
  • 4 AB CD
  • 5 AB CD
  • 6 AB CD
  • 7 AB CD

我试图将所选键中的所有值放入ArrayList中,然后替换ArrayList中的值,然后将ArrayList放入选定的键中,它应该替换键的值。

 ArrayList temp = new ArrayList();
 temp.addAll(seatMap.get(row));
 temp.set(inputKey, "X");
 seatMap.put(row, temp);

     for(Map.Entry<String, List<String>> entry : seatMap.entrySet()){
         String key= entry.getKey();
         List<String> values = entry.getValue();

            System.out.println(values);

     }

如果用户选择键:1和值A,则结果为。

  • [X,B,C,D]
  • [A,B,C,D]
  • [A,B,C,D]
  • [A,B,C,D]
  • [A,B,C,D]
  • [A,B,C,D]
  • [A,B,C,D]

但是如果用户然后选择键:2和值B,则键1的值变为键2的值

  • [X,X,C,D,A,B,C,D]
  • [X,X,C,D,A,B,C,D]
  • [A,B,C,D]
  • [A,B,C,D]
  • [A,B,C,D]
  • [A,B,C,D]
  • [A,B,C,D]

我想要一个像这样的输出

  • [X,B,C,X]
  • [A,X,C,D]
  • [A,B,C,D]
  • [A,B,X,X]
  • [A,X,C,D]
  • [A,B,C,D]
  • [A,B,C,X]

它会根据用户选择的内容放置和X. 我已经尝试在添加到HashMap之后清除ArrayList,但它删除了它的值并且它不会向HashMap添加任何内容。

1 个答案:

答案 0 :(得分:3)

首先,正如@earcam在评论中所说,当您使用seatMap的相同实例时,list中的所有值都会被共享。如果在一个列表中替换字符串,它将替换所有列表。

所以,在for循环中移动List<String> seatMap ...

    for(int i=1; i<8;i++){
        List<String> seats = new ArrayList<String>();
        seats.add("A");
        seats.add("B");
        seats.add("C");
        seats.add("D");

        k = Integer.toString(i);
        seatMap.put(k, seats);
    }

要替换元素,您可以使用set。来自关于集合的文档,

  

使用指定的元素替换此列表中指定位置的元素。

int key = 1, index = 2;
seatMap.get(Integer.toString(key)).set(2, "X");

为了示例,我是硬编码,密钥和索引。您可以根据自己的要求调整代码。

输出

  

1 AB XD

     

2 AB CD

     

3 AB CD

     

4 AB CD

     

5 AB CD

     

6 AB CD

     

7 AB CD

Demo