Професионална програма
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 3859 Точки
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