Advertisement
dzocesrce

[NP] Student Records

Apr 23rd, 2025
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.85 KB | None | 0 0
  1. public class StudentRecords {
  2.     List<Record> records;
  3.  
  4.     public StudentRecords() {
  5.         this.records = new ArrayList<>();
  6.     }
  7.  
  8.     public int readRecords(InputStream in) {
  9.         BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
  10.         records= bufferedReader.lines().map(Record::createRecord).collect(Collectors.toList());
  11.         return records.size();
  12.     }
  13.  
  14.     public void writeTable(PrintStream out) {
  15.         PrintWriter printWriter = new PrintWriter(out);
  16.         Map<String, Set<Record>> recordsByMajor = records.stream().collect(Collectors.groupingBy(
  17.            Record::getMajor,
  18.                 TreeMap::new,
  19.                 Collectors.toSet()
  20.         ));
  21.         for(String s : recordsByMajor.keySet()){
  22.             printWriter.println(s);
  23.             recordsByMajor.get(s).stream().sorted().forEach(printWriter::println);
  24.         }
  25.         printWriter.flush();
  26.     }
  27.  
  28.     public void writeDistribution(PrintStream out) {
  29.         PrintWriter printWriter = new PrintWriter(out);
  30.  
  31.         Map<String, Map<Integer, Long>> recordsByMajorAndDistributedByGrade = records.stream()
  32.                 .collect(Collectors.groupingBy(
  33.                         Record::getMajor,
  34.                         TreeMap::new,
  35.                         Collectors.flatMapping(
  36.                                 record -> record.getScores().stream(), // flatten all scores in each major
  37.                                 Collectors.groupingBy(
  38.                                         grade -> grade,
  39.                                         HashMap::new,
  40.                                         Collectors.counting()
  41.                                 )
  42.                         )
  43.                 ));
  44.         Map<String, Map<Integer, Long>> recordsByMajorAndDistributedByGradeSorted = recordsByMajorAndDistributedByGrade.entrySet()
  45.                 .stream().sorted(Comparator.<Map.Entry<String, Map<Integer, Long>>>comparingLong(entry -> entry.getValue().getOrDefault(10,0L))
  46.                         .reversed())
  47.                         .collect(Collectors.toMap(
  48.                         Map.Entry::getKey,
  49.                         Map.Entry::getValue,
  50.                         (a, b) -> a,
  51.                         LinkedHashMap::new
  52.  
  53.                 ));
  54.         for(String major : recordsByMajorAndDistributedByGradeSorted.keySet()){
  55.             printWriter.println(major);
  56.  
  57.             for(Integer grade : recordsByMajorAndDistributedByGradeSorted.get(major).keySet()){
  58.                 String stars = getStars(Math.round(recordsByMajorAndDistributedByGradeSorted.get(major).get(grade).intValue()/10));
  59.                 printWriter.println(String.format("%2d | %s(%d)",grade,stars,recordsByMajorAndDistributedByGradeSorted.get(major).get(grade)));
  60.             }
  61.         }
  62.  
  63.  
  64.         printWriter.flush();
  65.     }
  66.  
  67.     public String getStars(double numberOfStars){
  68.         StringBuilder sb= new StringBuilder();
  69.         for(int i=0;i<=numberOfStars;i++){
  70.             sb.append("*");
  71.         }
  72.         return sb.toString();
  73.     }
  74. }
  75. public class Record implements Comparable<Record>{
  76.  
  77.     String code;
  78.     String major;
  79.     List<Integer> scores;
  80.  
  81.     public Record(String code, String major, List<Integer> scores) {
  82.         this.code = code;
  83.         this.major = major;
  84.         this.scores = scores;
  85.     }
  86.  
  87.     public String getCode() {
  88.         return code;
  89.     }
  90.  
  91.     public String getMajor() {
  92.         return major;
  93.     }
  94.  
  95.     public List<Integer> getScores() {
  96.         return scores;
  97.     }
  98.  
  99.     public static Record createRecord(String line){
  100.         String[] parts = line.split(" ");
  101.         String code = parts[0];
  102.         String major = parts[1];
  103.         List<Integer> scores = Arrays.stream(parts).skip(2).map(i->Integer.parseInt(i)).collect(Collectors.toList());
  104.         return new Record(code,major,scores);
  105.     }
  106.  
  107.     public double getAverageScore(){
  108.         return scores.stream().mapToDouble(i->i).average().orElse(5.0);
  109.     }
  110.  
  111.  
  112.     @Override
  113.     public String toString() {
  114.         return String.format("%s %.2f",code,getAverageScore());
  115.     }
  116.  
  117.     @Override
  118.     public int compareTo(Record o) {
  119.         return Comparator.comparing(Record::getAverageScore)
  120.                 .reversed()
  121.                 .thenComparing(Record::getCode)
  122.                 .compare(this,o);
  123.     }
  124. }
  125. public class StudentRecordsTest {
  126.     public static void main(String[] args) {
  127.         System.out.println("=== READING RECORDS ===");
  128.         StudentRecords studentRecords = new StudentRecords();
  129.         int total = studentRecords.readRecords(System.in);
  130.         System.out.printf("Total records: %d\n", total);
  131.         System.out.println("=== WRITING TABLE ===");
  132.         studentRecords.writeTable(System.out);
  133.         System.out.println("=== WRITING DISTRIBUTION ===");
  134.         studentRecords.writeDistribution(System.out);
  135.     }
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement