ZelelB
ZelelB

Reputation: 2000

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

Upvotes: -1

Views: 774

Answers (3)

bpgergo
bpgergo

Reputation: 16037

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}}

Upvotes: 0

Kai
Kai

Reputation: 39651

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.

Upvotes: 0

nd.
nd.

Reputation: 8932

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

Upvotes: 2

Related Questions