Advertisement
StefanTodorovski

[НП] File System

Feb 6th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.99 KB | None | 0 0
  1. import java.time.LocalDateTime;
  2. import java.util.*;
  3. import java.util.stream.Collectors;
  4.  
  5. /**
  6.  * Partial exam II 2016/2017
  7.  */
  8. public class FileSystemTest {
  9.     public static void main(String[] args) {
  10.         FileSystem fileSystem = new FileSystem();
  11.         Scanner scanner = new Scanner(System.in);
  12.         int n = scanner.nextInt();
  13.         scanner.nextLine();
  14.         for (int i = 0; i < n; i++) {
  15.             String line = scanner.nextLine();
  16.             String[] parts = line.split(":");
  17.             fileSystem.addFile(parts[0].charAt(0), parts[1],
  18.                     Integer.parseInt(parts[2]),
  19.                     LocalDateTime.of(2016, 12, 29, 0, 0, 0).minusDays(Integer.parseInt(parts[3]))
  20.             );
  21.         }
  22.         int action = scanner.nextInt();
  23.         if (action == 0) {
  24.             scanner.nextLine();
  25.             int size = scanner.nextInt();
  26.             System.out.println("== Find all hidden files with size less then " + size);
  27.             List<File> files = fileSystem.findAllHiddenFilesWithSizeLessThen(size);
  28.             files.forEach(System.out::println);
  29.         } else if (action == 1) {
  30.             scanner.nextLine();
  31.             String[] parts = scanner.nextLine().split(":");
  32.             System.out.println("== Total size of files from folders: " + Arrays.toString(parts));
  33.             int totalSize = fileSystem.totalSizeOfFilesFromFolders(Arrays.stream(parts)
  34.                     .map(s -> s.charAt(0))
  35.                     .collect(Collectors.toList()));
  36.             System.out.println(totalSize);
  37.         } else if (action == 2) {
  38.             System.out.println("== Files by year");
  39.             Map<Integer, Set<File>> byYear = fileSystem.byYear();
  40.             byYear.keySet().stream().sorted()
  41.                     .forEach(key -> {
  42.                         System.out.printf("Year: %d\n", key);
  43.                         Set<File> files = byYear.get(key);
  44.                         files
  45.                                 //.sorted()
  46.                                 .forEach(System.out::println);
  47.                     });
  48.         } else if (action == 3) {
  49.             System.out.println("== Size by month and day");
  50.             Map<String, Long> byMonthAndDay = fileSystem.sizeByMonthAndDay();
  51.             byMonthAndDay.keySet().stream().sorted()
  52.                     .forEach(key -> System.out.printf("%s -> %d\n", key, byMonthAndDay.get(key)));
  53.         }
  54.         scanner.close();
  55.     }
  56. }
  57.  
  58. class File {
  59.     private String name;
  60.     private Integer size;
  61.     private LocalDateTime createdAt;
  62.  
  63.     public File(String name, Integer size, LocalDateTime createdAt) {
  64.         this.name = name;
  65.         this.size = size;
  66.         this.createdAt = createdAt;
  67.     }
  68.  
  69.     public String getName() {
  70.         return name;
  71.     }
  72.  
  73.     public Integer getSize() {
  74.         return size;
  75.     }
  76.  
  77.     public LocalDateTime getCreatedAt() {
  78.         return createdAt;
  79.     }
  80.  
  81.     @Override
  82.     public String toString() {
  83.         return String.format("%-10s %5dB %s", name, size, createdAt);
  84.     }
  85. }
  86.  
  87. class Folder {
  88.     private Character name;
  89.     private Set<File> files;
  90.  
  91.     public Folder(Character name) {
  92.         this.name = name;
  93.         this.files = new TreeSet<>(
  94.                 Comparator.comparing(File::getCreatedAt)
  95.                         .thenComparing(File::getName)
  96.                         .thenComparing(File::getSize)
  97.         );
  98.     }
  99.  
  100.     public void addFile(File newFile) {
  101.         files.add(newFile);
  102.     }
  103.  
  104.     public Character getName() {
  105.         return name;
  106.     }
  107.  
  108.     public Set<File> getFiles() {
  109.         return files;
  110.     }
  111. }
  112.  
  113. class FileSystem {
  114.     Map<Character, Folder> folders;
  115.  
  116.     public FileSystem() {
  117.         this.folders = new HashMap<>();
  118.     }
  119.  
  120.     public void addFile(char folder, String name, int size, LocalDateTime createdAt) {
  121.         Folder currFolder = folders.computeIfAbsent(folder, (f) -> new Folder(folder));
  122.         File newFile = new File(name, size, createdAt);
  123.         currFolder.addFile(newFile);
  124.     }
  125.  
  126.     public List<File> findAllHiddenFilesWithSizeLessThen(int size) {
  127.         return folders.values().stream()
  128.                 .flatMap((folder) -> folder.getFiles().stream())
  129.                 .filter((f) -> f.getName().startsWith(".") && f.getSize() < size)
  130.                 .collect(Collectors.toList());
  131.     }
  132.  
  133.     public int totalSizeOfFilesFromFolders(List<Character> folders) {
  134.         return folders.stream()
  135.                 .mapToInt((folder) -> {
  136.                     Folder inFolder = this.folders.get(folder);
  137.                     return inFolder.getFiles().stream()
  138.                             .mapToInt(File::getSize)
  139.                             .sum();
  140.                 }).sum();
  141.     }
  142.  
  143.     public Map<Integer, Set<File>> byYear() {
  144.         HashMap<Integer, Set<File>> byYear = new HashMap<>();
  145.         Comparator<File> comparatorByYear = Comparator.comparing(File::getCreatedAt)
  146.                 .thenComparing(File::getName)
  147.                 .thenComparing(File::getSize);
  148.  
  149.         folders.values().stream()
  150.                 .flatMap((folder) -> folder.getFiles().stream())
  151.                 .forEach((file) -> {
  152.                     Set<File> fileSet = byYear.computeIfAbsent(file.getCreatedAt().getYear(), (f) -> new TreeSet<>(comparatorByYear));
  153.                     fileSet.add(file);
  154.                 });
  155.  
  156.         return byYear;
  157.     }
  158.  
  159.     public Map<String, Long> sizeByMonthAndDay() {
  160.         Map<String, Long> byMonthAndDay = new HashMap<>();
  161.  
  162.         folders.values().stream()
  163.                 .flatMap((folder) -> folder.getFiles().stream())
  164.                 .forEach((file) -> {
  165.                     String monthAndDay = file.getCreatedAt().getMonth().toString() + "-" + file.getCreatedAt().getDayOfMonth();
  166.                     Long currValue = byMonthAndDay.computeIfAbsent(monthAndDay, (f) -> 0L);
  167.                     currValue += file.getSize().longValue();
  168.                     byMonthAndDay.put(monthAndDay, currValue);
  169.                 });
  170.  
  171.         return byMonthAndDay;
  172.     }
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement