Search code examples
javanestedtreemap

How to Map Values to a Nested TreeMap


Nested TreeMap:

TreeMap<String,TreeMap<String,TreeMap<String,String>>> map = new TreeMap<>();

Trying to map things to the TreeMap:

    add("1","1","1","111",map);
    map.add("1","1","1","111");
    map.put("1", ("1",("1","111")));

I am trying to map things to the nested TreeMap as seen above, but nothing I have tried has worked. What is the proper way to do what I am attempting?


Solution

  • You'll have to do it one step at a time, e.g. the simple case assuming all child maps already exist (note that we get the existing maps):

    map.get("1").get("1").put("1", "111");
    

    However, this isn't the case based on your description, and so each step of the way you'll have to create a new entry if one doesn't exist, so it becomes more complicated, as you have to look up the current map and then create/add:

    // from your example:
    
    String key1 = "1";
    String key2 = "1";
    String key3 = "1";
    String value = "111";
    
    // insert if doesn't exist yet:
    
    TreeMap<String,TreeMap<String,String>> map1 = map.get(key1);
    
    if (map1 == null) {
        map1 = new TreeMap<String,TreeMap<String,String>>();
        map.put(key1, map1);
    }
    
    // and again:
    
    TreeMap<String,String> map2 = map1.get(key2);
    
    if (map2 == null) {
        map2 = new TreeMap<String,String>();
        map1.put(key2, map2);
    }
    
    // and now we're set up and ready to go:
    
    map2.put(key3, map3);
    

    Since it's kind of cumbersome, it generally helps to write a utility function to do this for you.

    Alternatively, if it is appropriate for your application, you could consider collapsing your entire structure into a single map and using a more complex key, for example:

    static class ComplicatedKey implements Comparable<ComplicatedKey> {
        String key1;
        String key2;
        String key3;
        public ComplicatedKey (String key1, String key2, String key3) { ... }
        // implement equals and compareTo appropriately.
    }
    

    Then:

    TreeMap<ComplicatedKey,String> map = ...;
    
    map.put(new ComplicatedKey("1", "1", "1"), "111");
    

    Yet another option is to roll your own multi-level tree, you could even use a TreeMap internally in each of your nodes to maintain lists of child nodes.