我有一个表格
的TreeMapTreeMap<String, TreeMap<String, Integer>> map = new TreeMap<>();
包含roll_no,subject和marks。我想按照他们的标记对学生进行排序,因此需要反转TreeMap并使其形成:
TreeMap <TreeMap<Integer, String>, String> reverseMap = new TreeMap<>(Collections.reverseOrder());
答案 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()));
});
}