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 1168 Точки

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

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 923 Точки

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

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.