Как отсортировать вложенную карту по убыванию внутренних ключей, а затем по внутренним значениям в порядке возрастания? - PullRequest
0 голосов
/ 29 января 2020

У меня есть вложенная карта Map<String, Map<String, Integer>, например

("Samsung", ("Note", 30))

("Samsung", ("Galaxy", 20) )

("Apple", ("Iphone", 40))

Мне нужно отсортировать карту по внутреннему ключу в алфавитном порядке по убыванию (в этом примере case - название модели)

, и если два имени равны, то я должен отсортировать внутренние значения по возрастанию (в данном случае - цена).

My Сортировка на сегодняшний день выглядит следующим образом:

map.entrySet (). stream.forEach (entry -> entry.getValue (). entrySet (). stream () .sorted (Comparator.comparing (Map). .Entry :: getKey, Comparator.reverseOrder ()))

И я знаю, что должен добавить .thenComparing(), но я не знаю, как действовать дальше.

1 Ответ

0 голосов
/ 29 января 2020

Вы пишете CustomComparator следующим образом:

import java.util.*;

public int compare(Object obj1  , Object obj2){

        Map<String, Map<String, Integer> > map1 = (Map<String, Map<String, Integer>) obj1;
        Map<String, Map<String, Integer> > map2 = (Map<String, Map<String, Integer>) obj2;
        Map.Entry e1 = (Map.Entry)map1.entrySet();
        Map.Entry e2 = (Map.Entry)map2.entrySet();
        String brand1 = (String)e1.getKey();
        String brand2 = (String)e2.getKey();
        Map.Entry e3 = (Map.Entry)e1.getValue();
        Map.Entry e4 = (Map.Entry)e3.getValue();
        Integer price1 =(Integer) e3.getValue();
        Integer price2 =(Integer) e4.getValue();

        if(brand2.compareTo(brand1) != 0){
            return brand2.compareTo(brand1);
        }else{
            price1.compareTo(price2);
        }
      }
    }

Этот компактор будет сначала сортировать данные в порядке убывания названия бренда И если два бренда имеют одинаковое имя, то для этого он будет сортироваться в порядке возрастания цены.

Вы должны добавить свои данные в TreeMap следующим образом

Set data = new TreeSet(new CustomComparator()); //Add your data here in data object

...