【问题标题】:Reverse a nested TreeMap in Java在 Java 中反转嵌套的 TreeMap
【发布时间】:2018-06-04 10:37:38
【问题描述】:

我有一个表格的 TreeMap

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

其中包含一个roll_no、主题和标记。我想按学生的分数对学生进行排序,因此需要反转 TreeMap 并使其成为以下形式:

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

【问题讨论】:

  • 好的。你现在有什么问题?
  • 这是一个非常糟糕的设计。创建具有所需属性的学生类。为学生类创建单独的比较器,用于卷号、标记、姓名等字段。当您想要对学生进行排序时,在创建 TreeSet 时,还将所需的比较器作为参数传递。
  • 哪张地图有roll_no、subjects和marks,可以在这里说明一下吗?
  • 两张地图都有roll_no、subject和marks,其中roll_no和subject是字符串,marks是int。所以地图看起来像 map> 我希望地图是 .
  • TreeMap map1 = new TreeMap();请更改哪个映射引用哪个属性的变量名称。 TreeMap> map = new TreeMap();

标签: java hashmap treemap


【解决方案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}

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

如果你想要两者,那么使用 putAllTreeMap 和反向比较器:

Map<String, Integer> reversedMap = new TreeMap<>(Collections.reverseOrder());
reversedMap.putAll(map);

System.out.println(reversedMap);

请注意,我完全忽略了您的数据结构,因为这不合适,所以我保持我的设计简单以展示可以做什么。 MapMap 不是一个好主意。

【讨论】:

    【解决方案2】:

    这应该可行。还举了一个例子。有问题请告知。

        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()));
            });
    
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      相关资源
      最近更新 更多