Обратный порядок вложенных TreeMap в Java - PullRequest
0 голосов
/ 04 июня 2018

У меня есть древовидная карта вида

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

, которая содержит roll_no, subject и отметки.Я хочу отсортировать студентов по их оценкам и, следовательно, нужно перевернуть TreeMap и сделать его следующим образом:

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

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Это должно работать.Также привел пример.Пожалуйста, сообщите, если какие-либо вопросы.

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


    }
0 голосов
/ 04 июня 2018

Почему бы просто не перевернуть компаратор с самого начала, передав конкретный экземпляр 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 с TreeMap с обратным компаратором:

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

System.out.println(reversedMap);

Обратите внимание, что я полностью игнорирую вашу структуру данных, поскольку это не подходит, поэтому я оставил свой дизайн простым, чтобы показать, что можно сделать.Map из Map не очень хорошая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...