在Java中反转嵌套的TreeMap

时间:2018-06-04 10:37:38

标签: java hashmap treemap

我有一个表格

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

包含roll_no,subject和marks。我想按照他们的标记对学生进行排序,因此需要反转TreeMap并使其形成:

TreeMap <TreeMap<Integer, String>, String> reverseMap = new TreeMap<>(Collections.reverseOrder());

2 个答案:

答案 0 :(得分:1)

为什么不通过将特定的comparator实例传递给TreeMap构造函数来从一开始就反转比较器:

Map<String, Integer> map = new TreeMap<>(Collections.reverseOrder());
map.put("foo", 1);
map.put("bar", 2);
map.put("doe", 3);

System.out.println(map);
  

{foo = 1,doe = 3,bar = 2}

当然,没有反向比较器:

  

{bar = 2,doe = 3,foo = 1}

该解决方案不需要两张地图(原始地图和反转地图)。

如果你想要两者,那么使用带有反向比较器putAll的{​​{1}}:

TreeMap

请注意,我完全忽略了您的数据结构,因为这是不合适的,因此我保持设计简单,以显示可以执行的操作。 Map<String, Integer> reversedMap = new TreeMap<>(Collections.reverseOrder()); reversedMap.putAll(map); System.out.println(reversedMap); Map不是个好主意。

答案 1 :(得分:1)

这应该有效。还举了一个例子。请告诉我是否有任何问题。

    public static void main(String[] args) {

        TreeMap<String, TreeMap<String, Integer>> map = new TreeMap<>();
        TreeMap <TreeMap<Integer,String>, String> reverseMap = new TreeMap<>(Collections.reverseOrder((o1,o2) -> 1));
        TreeMap<String,Integer> r1=new TreeMap<>();
        r1.put("English", 80);
        r1.put("Maths", 90);
        r1.put("Science", 75);
        r1.put("Biology", 50);


        TreeMap<String,Integer> r2=new TreeMap<>();
        r2.put("English", 50);
        r2.put("Maths", 60);
        r2.put("Science", 80);
        r2.put("Biology", 70);

        map.put("1", r1);
        map.put("2", r2);


        map.entrySet().stream().sorted((obj1,obj2)->{
            if(obj1.getValue().values().stream().mapToInt(Integer::intValue).sum() > obj2.getValue().values().stream().mapToInt(Integer::intValue).sum()) return 1;
            else if(obj1.getValue().values().stream().mapToInt(Integer::intValue).sum() < obj2.getValue().values().stream().mapToInt(Integer::intValue).sum()) return -1;
            return 0;
        }).collect(Collectors.toSet()).forEach(t-> {
            TreeMap<Integer,String> newmap=new TreeMap<>(Collections.reverseOrder());
            t.getValue().forEach((k,v)-> newmap.put(v, k));
            reverseMap.put(newmap, t.getKey());             
        });

        reverseMap.entrySet().forEach(t-> {System.out.println("Roll no: "+t.getValue());t.getKey().entrySet().forEach(a-> System.out.println(a.getKey()+" "+a.getValue()));
        });


    }