如何制作包含列表的java hashmap?

时间:2014-06-11 06:50:08

标签: java list arraylist map hashmap

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

import mainak.faisal;
import mainak.pulkit;

public class StartingPoint {

    public static void main( String trav[] ) {
        final Map<String, List<String>> paramMap = new HashMap<>();
        List<String> list1 = new ArrayList<String>();
        list1.add("1");
        paramMap.put("segment", list1);
        list1.clear();
        list1.add("2");
        paramMap.put("subDepartment", list1);
        list1.clear();
        list1.add("3");
        paramMap.put("officerTitle", list1);

        for( Map.Entry<String, List<String>> entry : paramMap.entrySet() ) {
            String key = entry.getKey();
            System.out.println("ACTIONKEY"+"------"+key);

            for (String value : entry.getValue()) {
                System.out.println("ACTIONVALUE-----"+value);
            }
        }
    }
}

预期产出:

ACTIONKEY------segment
ACTIONVALUE-----1
ACTIONKEY------subDepartment
ACTIONVALUE-----2
ACTIONKEY------officerTitle
ACTIONVALUE-----3

但它显示:

ACTIONKEY------segment
ACTIONVALUE-----3
ACTIONKEY------subDepartment
ACTIONVALUE-----3
ACTIONKEY------officerTitle
ACTIONVALUE-----3

为什么会这样?如何在不制作不同列表的情况下实现预期结果?

6 个答案:

答案 0 :(得分:2)

如果您想在地图中使用3个不同的列表,则需要创建3个列表。仅创建一个列表将导致地图包含对同一列表的3个引用,包含您在最后一步中存储在列表中的内容:

segment ---------
                 \
subDepartment----  [3]
                 /
officerTitle ----

你想要的是

segment --------- [1]

subDepartment---- [2]

officerTitle ---- [3]

所以你需要3个不同的列表。了解将列表放在地图中不会创建列表的副本。它只将一个引用(一个指针,如果你愿意)存储到作为参数传递的列表中。

答案 1 :(得分:2)

当您在java中传递对象时,实际上传递了该对象的引用,并且您添加的所有项目都指向与他的答案中解释的 JB Nizet 相同的列表对象。以下是你可以做的事情:

  1. 每次将其添加到Hashmap对象时创建一个新列表。
  2. 使用Google Guava Collections:

     Multimap<String, String> multiMap = ArrayListMultimap.create();
    
     // put values into map for segment
    
     multiMap.put("segment", "1");
     multiMap.put("segment", "100");
    
     // put values into map for subDepartment
    
     multiMap.put("subDepartment", "2");
     multiMap.put("subDepartment", "200");
    
     // put values into map for officerTitle
    
     multiMap.put("officerTitle", "3");
     multiMap.put("officerTitle", "300");
    
  3. 或使用Apache Commons Collection,如:

     // create multimap to store key and values
    
     MultiMap multiMap = new MultiValueMap();
    
     // put values into map for segment
    
     multiMap.put("segment", "1");
     multiMap.put("segment", "100");
    
     // put values into map for subDepartment
    
     multiMap.put("subDepartment", "2");
     multiMap.put("subDepartment", "200");
    
     // put values into map for officerTitle
    
     multiMap.put("officerTitle", "3");
     multiMap.put("officerTitle", "300");
    
  4. 所有人都会给你正确的输出。 !

答案 2 :(得分:1)

这是因为您只将一个List对象实例引用到HashMap。

当对List的引用更改HashMap的值更改时。

在你的情况下

    list1.add("1");
    paramMap.put("segment", list1);
    list1.clear();
    list1.add("2");
    paramMap.put("subDepartment", list1);
    list1.clear();
    list1.add("3");

清除后添加到列表中的最后一个值将是HashMap

中所有数据的值

<强>溶液

每次添加到HashMap时都创建一个新的List实例

答案 3 :(得分:1)

您需要在放入HashMap之前创建一个列表,

   public static void main(String trav[]){
        final Map<String, List<String>> paramMap = new HashMap<>();
        paramMap.put("segment", Lists.newArrayList("1"));
        paramMap.put("subDepartment", Lists.newArrayList("2"));
        paramMap.put("officerTitle", Lists.newArrayList("3"));
        for(Map.Entry<String, List<String>> entry : paramMap.entrySet()) {
            String key = entry.getKey();
            System.out.println("ACTIONKEY"+"------"+key);
            for (String value : entry.getValue()) {
                System.out.println("ACTIONVALUE-----"+value);
            }
    }

答案 4 :(得分:0)

每次要放入地图时,都必须创建新列表。这是因为map正在检查列表的引用,并且您正在插入具有相同引用的列表,并且map将不存储重复键,因此基本上它会使用最后给定的列表值更新条目。

答案 5 :(得分:0)

您可以每次创建新列表,并为其添加值,然后将其放入地图中。

像这样......

地图&lt;字符串,列表&lt;串GT;&GT; map = new HashMap&lt;字符串,列表&lt;串GT;&GT;();

    // create list one and store values
    List<String> valSetOne = new ArrayList<String>();
    valSetOne.add("1");
    //valSetOne.add("Aeroplane");

    // create list two and store values
    List<String> valSetTwo = new ArrayList<String>();
    valSetTwo.add("2");
   // valSetTwo.add("Banana");

    // create list three and store values
    List<String> valSetThree = new ArrayList<String>();
    valSetThree.add("3");
    //valSetThree.add("Car");

    // put values into map
    map.put("A", valSetOne);
    map.put("B", valSetTwo);
    map.put("C", valSetThree);


    for (Map.Entry<String, List<String>> entry : map.entrySet()) {
        String key = entry.getKey();
        List<String> values = entry.getValue();
        System.out.println("Key = " + key);
        System.out.println("Values = " + values );
    }
}