Loading...
AnnaIvanova11 avatar AnnaIvanova11 21 Точки

#Java - More Exercise: Associative Arrays, Lambda and Stream API - Exercise 2.0 - Judge

Здравейте,

Пускам работещ, код.

Моля, ако някой може да постне различно от моето решение, за да видя друг подход.

И също ако имате някакви коментари или препоръки/мнение, особено относно stream-а ще съм много благодарна, аз се затруднявам.

https://pastebin.com/0DGeb4BN - Код

https://pastebin.com/fYyLkbcB - Условие

 

Тагове:
1
Fundamentals Module
MartinBG avatar MartinBG 4803 Точки
Best Answer

Това е твоето решение, като съм опростил прочитането на входните данни, сортирането и сумирането на точките за всеки участник:

import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.stream.Collectors;

public class Demo {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        Map<String, Map<String, Integer>> contests = new LinkedHashMap<>();

        String input;
        while (!"no more time".equals(input = scan.nextLine())) {
            String[] tokens = input.split(" -> ");
            String userName = tokens[0];
            String course = tokens[1];
            int userPoints = Integer.parseInt(tokens[2]);

            contests.putIfAbsent(course, new HashMap<>());
            contests.get(course)
                    .compute(userName, (user, oldPoints) ->
                            (oldPoints == null || oldPoints < userPoints) ? userPoints : oldPoints);
        }

        Comparator<Map.Entry<String, Integer>> participantsComparator = Map.Entry.<String, Integer>
                comparingByValue(Comparator.reverseOrder())
                .thenComparing(Map.Entry.comparingByKey());

        contests.forEach((contest, participants) -> {
            System.out.printf("%s: %d participants\n", contest, participants.size());
            final int[] count = {0};
            participants.entrySet()
                    .stream()
                    .sorted(participantsComparator)
                    .forEach(entry -> {
                        count[0] += 1;
                        System.out.printf("%d. %s <::> %d%n", count[0], entry.getKey(), entry.getValue());
                    });
        });

        System.out.println("Individual standings:");
        final int[] count = {0};
        contests.values()
                .stream()
                .flatMap(m -> m.entrySet().stream())
                .collect(Collectors.groupingBy(
                              Map.Entry::getKey, 
                              Collectors.summingInt(Map.Entry::getValue)))
                .entrySet()
                .stream()
                .sorted(participantsComparator)
                .forEach(entry -> {
                    count[0] += 1;
                    System.out.printf("%d. %s -> %d%n", count[0], entry.getKey(), entry.getValue());
                });
    }
}

Като препоръки: 

  • стреми се да пишеш по-малко код в програмите си - ако за тривиален проблем си изписала много код (напр. прочитането на входа за тази задача), потърси в нета решения на сходни задачи
  • избирай правилните структури от данни за конкретния проблем; колкото по-прости - толкова по-добре, стига да вършат работа
  • старай се да преизползваш кода (в случая компаратора), вместо да го копираш
  • запознай се с API-тата на класовете, които ползваш - често има готови методи, които спестяват време и проблеми
  • използвай смислени имена дори и за променливи с кратък живот
1
AnnaIvanova11 avatar AnnaIvanova11 21 Точки

Когато не разбирам, точно какво се случва винаги усложнявам  и утежнявам кода/писането, вместо да опростя. Всичко, което си дал ми е много полезно и ценно.

Благодаря за отделеното време!!!

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