简体   繁体   中英

Why is my nested hashmap setting all the values to the same thing?

This is my first foray into java, and I am having trouble understanding how maps work. I have a for loop which appends maps of information into another map. However when I look at the outermost map it contains the correct number of sub-maps, however they all conatin the same information, even though I originally put different information in them... does anyone know why?

Thanks,

Lemiant

Below I have included my code and the System.out.print output:

Code:

Map continents = new HashMap();
Map continentData = new HashMap();
int lastContinent = -1;


//Accumulate Continent data
for(Country currCountry : countries){
    continentData.clear();
    int currContinent = currCountry.getContinent();

    continentData.put("P", 0);
    continentData.put("E", 1);
    continentData.put("O", 2);
    continentData.put("Bonus",currContinent);

    if(currContinent != lastContinent){
        continents.put(currContinent, continentData);
        System.out.println("add");
        System.out.println(continentData);
    }

    lastContinent = currContinent;
}

System.out.println(continents.toString());

Result:

add
{E=1, P=0, O=2, Bonus=0}
add
{E=1, P=0, O=2, Bonus=1}
add
{E=1, P=0, O=2, Bonus=2}
add
{E=1, P=0, O=2, Bonus=3}
add
{E=1, P=0, O=2, Bonus=4}
add
{E=1, P=0, O=2, Bonus=5}
{0={E=1, P=0, O=2, Bonus=5}, 1={E=1, P=0, O=2, Bonus=5}, 2={E=1, P=0, O=2, Bonus=5}, 3={E=1, P=0, O=2, Bonus=5}, 4={E=1, P=0, O=2, Bonus=5}, 5={E=1, P=0, O=2, Bonus=5}}

You need to move Map continentData = new HashMap(); inside your for loop so that a separate map is created on each pass. Right now you're just updating the same map over and over.

You are using the same instance of continentData for all the maps. You must instantiate a new Map for it in each loop interation.

for(Country currCountry : countries){
    //continentData.clear();
    Map continentData = new HashMap();
    int currContinent = currCountry.getContinent();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM