Advertisement
Martina312

[НП] - File System

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