كيفية فرز خريطة التجزئة استنادا إلى عدد من المفاتيح لقيمة باستخدام فلاتماب java8؟



hash lambda (1)

هذا هو متابعة لكيفية الحصول على عدد من مفاتيح للقيم في خريطة التجزئة باستخدام لامدا . لدي HashMap وأريد أن أجد عدد المفاتيح لكل قيمة

Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>() {{
    put(0, Arrays.asList(1, 2));
    put(1, Arrays.asList(2, 0, 3));
    put(2, Arrays.asList(4,0,1));
    put(3, Arrays.asList(4,1, 5));
    put(4, Arrays.asList(5,2,3));
    put(5, Arrays.asList(4,3));
}};

وفقا للمنصب أعلاه، حاولت رسم الخرائط مسطحة:

Map<Object, Long> ex = 
                map.values()
                .stream()
                .flatMap(Collection::stream)
                .collect(Collectors.groupingBy(v -> v, Collectors.counting()));

System.out.println(ex);

الإخراج هو

{0=2, 1=3, 2=3, 3=3, 4=3, 5=2}. 

وهذا يعني 0 لديه مفتاحين، 1 لديه ثلاثة مفاتيح وهلم جرا. الآن أريد أن فرز المفاتيح والقيم في ترتيب تنازلي على أساس عدد من المفاتيح. حاولت شيئا من هذا القبيل:

Map<Object, Long> ex = 
                map.values()
                .stream()
                .flatMap(Collection::stream)
                .collect(Collectors.groupingBy(v -> v, Collectors.counting()));

                        .entrySet()
                        .stream()
                        .sorted(Map.Entry.<String, Long>comparingByValue(reverseOrder()).thenComparing(Map.Entry.comparingByKey()))
                        .collect(LinkedHashMap::new, (m,e) -> m.put(e.getKey(), e.getValue()), Map::putAll);

أريد الإخراج التالي:

1=[2, 3, 0], 2=[1,4,0], 3=[1, 4, 5], 4=[2, 3, 5], 0=[1, 2], 5=[3, 4]

يجب ترتيب المفاتيح والقيم في تنازلي وفقا لهذا العدد من المفاتيح {0=2, 1=3, 2=3, 3=3, 4=3, 5=2} : 1، 2، 3، 4 ثلاثة مفاتيح، 0 و 5 ديك مفتاحين.

على سبيل المثال: 1=[2, 3, 0] : 1 لها ثلاثة مفاتيح بحيث تظهر أولا مع [2, 3, 0] : 2 و 3 لها ثلاثة مفاتيح و 0 لها مفتاحان فقط.


يمكن أن يكون لديك ما يلي:

Map<Integer, List<Integer>> sorted = 
    map.entrySet()
       .stream()
       .sorted(comparing(e -> ex.get(e.getKey()), reverseOrder()))
       .collect(toMap(
           Map.Entry::getKey,
           e -> e.getValue().stream().sorted(comparing(ex::get, reverseOrder())).collect(toList()),
           (v1, v2) -> { throw new IllegalStateException(); },
           LinkedHashMap::new
       ));

هذا يخلق تيار من إدخالات الخريطة، يصنفها في ترتيب عكسي وفقا لعدد مفاتيح مفتاح ذلك الدخول، وأخيرا يجمع ذلك إلى خريطة حيث يتم فرز القيمة الجديدة في ترتيب عكسي فيما يتعلق عد كل عدد صحيح ( ex::get ). خريطة جمع هو LinkedHashMap للحفاظ على أمر لقاء.

انتاج:

{1=[2, 3, 0], 2=[4, 1, 0], 3=[4, 1, 5], 4=[2, 3, 5], 0=[1, 2], 5=[4, 3]}

الواردات الساكنة المستخدمة:

import static java.util.Comparator.comparing;
import static java.util.Comparator.reverseOrder;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;




java-stream