Софтуерно Инженерство
Loading...
+ Нов въпрос
Sideroff avatar Sideroff 22 Точки

[JAVA] Функционално сортиране на Map

Здрравейте,

Опитвам се да реша задача от C# Advanced изпит от 19 юли 2015, Population counter, на Java, но не мога да се сетя за начин да сортирам елементите в map-а функционално. С решението съм стигнал до тук. Някакви идеи?

 

EDIT: Намерих решение на задачата и е точно това, което търсех: решение. Може да затворите темата.
 

Тагове:
2
Java Advanced 12/11/2015 21:35:13
Nick1R1 avatar Nick1R1 115 Точки

 Може да направиш един forech на външния Treemap и вътре с функционално да обходиш вложения мап. Трябва да изглежда горе долу така: 

for (Map.Entry<String, TreeMap<String, Long>> item: map.entrySet()) {
    System.out.printf("%s : ", item.getKey());
    item.getValue().entrySet().stream().
    forEach((entry) -> {
        // printing entry.getKey & entry.getValue
    });
}

 

0
12/11/2015 18:03:53
Sideroff avatar Sideroff 22 Точки

Въпроса е там, че искам да ги сортирам по сумата на хората от всяка държава, или с други думи, държавата с най-много хора да излиза най-отгоре. Не съм много на "ти" с lambda изразите в java, така че ако някой има свободно време, да постне едно решение?

0
12/11/2015 19:11:12
Nick1R1 avatar Nick1R1 115 Точки

Пробвай с това след stream().

sorted((x1, x2) -> x2.getValue().compareTo(x1.getValue())).forEach((entry) -> {

// print item.getKey() & item.getValue()

});
1
12/11/2015 23:02:04
enevlogiev avatar enevlogiev 1169 Точки

Ето ти един пример:

countries.entrySet().stream()
                .sorted((e1, e2) -> {
                    int sumFirstEntry = getSumOfAllElements(e1.values);
                    int sumSecondEntry = getSumOfAllElements(e2.values);
                    
                    return Integer.compare(sumSecondEntry, sumFirstEntry);
                });

е1 и е2 са две поредни entry-та. Т.е. key-value pair. Срявнява ги и преценява дали трябва да ги размени, или не. Но как преценява кое е по-голямо/малко? Все пак като ключ имаме стринг, а като стойност - вътрешна хеш-таблица. Критериите трябва да определим сами - в случая е сумата на всички стойности от вътрешната хеш-таблица. Със същия успех можехме да сортираме по бройката стойности в таблицата, по дължината на първия стринг, по каквото и да е, стига да го имаме някъде из е1 и е2 ; )

getSumOfAllElements() е метод, който сам трябва да си напишеш. Тривиален е, просто в един цикъл с += събираш всичко и накрая го връщаш. След това в Integer.compare(), според това в какъв ред са аргументите (дали 1,2 или 2,1) ще сортира в низходящ или възходящ ред.

 

 

2
bacuty avatar bacuty 55 Точки

Аз излзвах два Map-a  :) в единия сумирах за всяка страна населението, другия за градовете.

1
djc_bg2015 avatar djc_bg2015 922 Точки

Става, и аз така направих :)

0