IrinaIgnatova

Courses-Maps, Lambda, Stream

Jul 18th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.89 KB | None | 0 0
  1. package com.company;
  2.  
  3.  
  4. import java.util.*;
  5. import java.util.stream.Collectors;
  6.  
  7. public class Main {
  8.  
  9.     public static void main(String[] args) {
  10.  
  11.         Scanner scanner = new Scanner(System.in);
  12.         String input = scanner.nextLine();
  13.         LinkedHashMap<String, ArrayList<String>> studentsInCourse = new LinkedHashMap<>();
  14.         while (!input.equals("End")) {
  15.             String[] tokens = input.split(" : ");
  16.             String course = tokens[0];
  17.             String name = tokens[1];
  18.             if (!studentsInCourse.containsKey(course)) {
  19.                 studentsInCourse.put(course, new ArrayList<>());
  20.                 studentsInCourse.get(course).add(name);// в текущия курс добавяме студента
  21.             } else {
  22.                 studentsInCourse.get(course).add(name);
  23.             }
  24.  
  25.             input = scanner.nextLine();
  26.         }
  27.  
  28.         studentsInCourse
  29.                 .entrySet()
  30.                 .stream()//минаваме по всички двойки key-value
  31.                 //първо сортираме по брой студенти в курс , т.е по value на ArrayList,  .size e int за това Comparator.comparingInt(за всеки лист::размера)
  32.                 .sorted(Map.Entry.<String, ArrayList<String>>comparingByValue(Comparator.comparingInt(ArrayList::size))//size ни дава броя за съответния курс
  33.                         .reversed()
  34.                         .thenComparing(Map.Entry.comparingByKey()))//ако са с равен брой студенти подреждаме по key за това LinkedHashMap
  35.                 .forEach(entry -> {//може да си го кръстим и само е вместо entry, но на следващия forEach когато печатаме value трябва
  36.                                    // да го кръстим по друг начин а не пак е
  37.                     String temp = String.valueOf(entry.getValue().size());//в променлива пазим броя студенти за даден курс
  38.                     //за да можем да изпечатаме броя
  39.                     System.out.printf("%s: %s%n", entry.getKey(), temp);// слагаме след печатането ; и продължаваме на нов ред с                      
  40.                                                                                                    //  печатането на value
  41.  
  42.                     entry.getValue()// в случая value е текущото име
  43.                             .stream()
  44.                             .sorted(Comparator.naturalOrder())//по азбучен ред
  45.                             .forEach(e -> System.out.printf("-- %s%n", e));//за да изпечата всяко следващо име правим ламбда
  46.                 });
  47.  
  48.  
  49.     }
  50.  
  51. }
Add Comment
Please, Sign In to add comment