Advertisement
NenadKocev

[НП] File system

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