簡體   English   中英

如何制作一個包含列表的Java hashmap?

[英]How to make a java hashmap containing list?

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

為什么會這樣呢? 如何在沒有列出其他清單的情況下達到期望的結果?

如果要在地圖中包含3個不同的列表,則需要創建3個列表。 僅創建一個列表將導致地圖包含對同一列表的3個引用,其中包含您在最后一步中存儲在列表中的內容:

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

你想要的是

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

subDepartment---- [2]

officerTitle ---- [3]

因此,您需要3個不同的列表。 了解將列表放在地圖中不會創建列表的副本。 它僅存儲對作為參數傳遞的列表的引用(如果需要,則為指針)。

在Java中傳遞對象時,實際上傳遞的是該對象的引用,您添加的所有項目都指向JB Nizet在其答案中解釋的同一列表對象。 以下是您可以做的事情:

  1. 每次將其添加到Hashmap對象時,都要創建一個新列表。
  2. 使用Google Guava收藏集,例如:

      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"); 

一切都會為您提供正確的輸出。

這是因為您僅將List對象的一個​​實例引用到HashMap。

當對列表的引用更改時,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的新實例

您需要先創建一個列表,然后再放入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);
            }
    }

每次要放入地圖時,都必須創建一個新列表。 這是因為map正在檢查列表的引用,並且您要插入具有相同引用的列表,並且map不會存儲重復的鍵,因此基本上它會使用最后給定的列表值來更新條目。

您可以每次創建新列表,並為其添加值,然后放入地圖。

像這樣..

Map <String,List <String >> map = new HashMap <String,List <String >>();

    // 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 );
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM