desislava_topuzakova

02. Race

Nov 19th, 2021
1,369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.72 KB | None | 0 0
  1. package Regex_Exercise;
  2.  
  3. import java.util.*;
  4. import java.util.regex.Matcher;
  5. import java.util.regex.Pattern;
  6. import java.util.stream.Collectors;
  7.  
  8. public class Race_02 {
  9.     public static void main(String[] args) {
  10.         Scanner scanner = new Scanner(System.in);
  11.         //"George, Peter, Bill, Tom".split(", ") -> ["George", "Peter", "Bill", "Tom"]
  12.         List<String> racers = Arrays.stream(scanner.nextLine().split(", ")).collect(Collectors.toList());
  13.         Map<String, Integer> racersDistances = new LinkedHashMap<>();
  14.         //име на състезателя -> дистанция
  15.         racers.forEach(racer -> racersDistances.put(racer, 0));
  16.         //Регекси
  17.         String regexLetter = "[A-Za-z]+";
  18.         Pattern patternLetter = Pattern.compile(regexLetter);
  19.  
  20.         String regexDigit = "[0-9]";
  21.         Pattern patternDigit = Pattern.compile(regexDigit);
  22.  
  23.         String input = scanner.nextLine();
  24.         while(!input.equals("end of race")) {
  25.             //input = "G!32e%o7r#32g$235@!2e"
  26.             //1. игнорирам специални символи различни от буква и цифра
  27.             //2. буквите -> име на състезателя
  28.             StringBuilder nameBuilder = new StringBuilder(); // конструирам името на състезателя
  29.             Matcher matcherName = patternLetter.matcher(input); //всички букви -> ["G", "e", "o", "r", "g", "e"]
  30.             while (matcherName.find()) {
  31.                 nameBuilder.append(matcherName.group());
  32.             }
  33.             //3. сума на цифри -> разстоянието
  34.             int distance = 0;
  35.             Matcher matcherDigits = patternDigit.matcher(input); //всички цифри -> ["3", "2", "7", "3", "2"]
  36.             while (matcherDigits.find()) {
  37.                 distance += Integer.parseInt(matcherDigits.group());
  38.             }
  39.  
  40.             //име на човек + дистанция
  41.             String racerName = nameBuilder.toString(); //име на състезателя
  42.             if (racersDistances.containsKey(racerName)) {
  43.                 int currentDistance = racersDistances.get(racerName);
  44.                 racersDistances.put(racerName, currentDistance + distance);
  45.             }
  46.  
  47.             input = scanner.nextLine();
  48.         }
  49.         //начин 1:
  50.         //връщаме мап с първите три елемента след сортирането
  51.         /*Map<String,Integer> firstThreeRacers = racersDistances.entrySet().stream()
  52.                 .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))//descending order (намаляващ ред)
  53.                 .limit(3)
  54.                 .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a1, a2) -> a1, LinkedHashMap::new));*/
  55.  
  56.  
  57.         //състезател -> избягана дистанция
  58.         //1. сортираме по value (дистанция) в descending order
  59.         //racersDistances.entrySet().stream().sorted(Map.Entry.comparingByValue()) -> ascending order (нарастващ ред)
  60.         //начин 2:
  61.         //списък с имената на първите трима
  62.         List<String> firstThreeNames = racersDistances.entrySet().stream()
  63.                 .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
  64.                 .limit(3) //получавам мап с 3 записа
  65.                 .map(entry -> entry.getKey())
  66.                 .collect(Collectors.toList());
  67.  
  68.         System.out.println("1st place: " + firstThreeNames.get(0));
  69.         System.out.println("2nd place: " + firstThreeNames.get(1));
  70.         System.out.println("3rd place: " + firstThreeNames.get(2));
  71.  
  72.     }
  73. }
Advertisement
Add Comment
Please, Sign In to add comment