简体   繁体   中英

Reverse a map that contains another nested map

i would like to know how can I get a new map that is the reversed map of mine? My actual Map looks like that:

centralMap = new HashMap<String, Map<String, String>>();
nestedMap = new HashMap<String, String>();

the nestedMap is just created in the put-method.. and to put an element i use the following in the main method:

TrueStringMap2D testmap = new TrueStringMap;
testmap.put("Mickey Mouse","Mathematics","1.0");
testmap.put("Mickey Mous","Physics","1.3");
testmap.put("Minnie","Chemistry","2.3");
......

now i would like to reverse the map through a method that i named "flipped()" i want to change the Keys of the nestedMap to Keys of the centralMap, and vice-versa.. so every "subject" (like mathematics, physics, ..) will have a nestedMap of students and the grades.. how could i do that?

im not allowed to create classes in my TrueString2D.. i just need to copy perhaps the Keys of the centralMap in a list, and those of the nestedMap in another List, and then create a new map HashMap>(); (same as my centralMap) and copy the list of old keys of the nestedMap in the NEW created map (for ex. newCentralMap) as keys, and as value, i'll copy the old keys of the centralMap in the newNestedMap and the values of the newNestedMap are the same as the ones on the old map.. but i dont know exactly how to do that, and if i can copy a list in a map :S

Thankyou verymuch

Use something different for storing your items:

  • Guava has a Table class that implements the features you are asking for
  • If you need even more flexibility, consider an in-memory database

I wouldn't use maps for this. I would just use a Collection<PersonGrade> .

class PersonGrade {
   String name;
   String subject;
   Double grade;
}

Then when you want to generate a report about "All grades of Mickey Mouse on all subjects" iterate over the Collection and take the objects which fits that criteria. I know this could be a bit slow when you are dealing with a huge amount of data. But I would really give it a try.

Why don't you use HashMap<String, Map<String, String>>() instead of TrueStringMap2D

import java.util.HashMap;
import java.util.Map;

public class Flip {


    public static Map <String, Map<String, String>> flip(Map <String, Map<String, String>> map){
        Map <String, Map<String, String>> result = new HashMap<String, Map<String, String>>();
        for (String key : map.keySet()){
            for (String key2 : map.get(key).keySet()){
                if (!result.containsKey(key2)){
                    result.put(key2, new HashMap<String, String>());
                }

                result.get(key2).put(key, map.get(key).get(key2));
            }
        }


        return result;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        Map <String, Map<String, String>> map = new HashMap<String, Map<String, String>>();

        map.put("Mickey", new HashMap<String, String>());
        map.get("Mickey").put("Physics", "1.1");
        map.get("Mickey").put("Maths", "1.2");

        map.put("Minnie", new HashMap<String, String>());
        map.get("Minnie").put("Physics", "1.1");
        map.get("Minnie").put("Chemistry", "1.3");

        System.out.println(map);

        System.out.println(flip(map));
    }

}

the output

{Minnie={Physics=1.1, Chemistry=1.3}, Mickey={Maths=1.2, Physics=1.1}}
{Maths={Mickey=1.2}, Physics={Minnie=1.1, Mickey=1.1}, Chemistry={Minnie=1.3}}

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