Guest User

Untitled

a guest
May 29th, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.83 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. /*
  5. Нити и байты
  6. */
  7.  
  8. public class Solution {
  9.     public static Map<String, List<Integer>> resultMap = new HashMap<>();
  10.  
  11.     public static void main(String[] args) {
  12.  
  13. //        // читаем имена файлов и записываем в resultMap
  14. //        try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
  15. //            String fileName;
  16. //
  17. //            while (!(fileName = reader.readLine()).equals("exit")) {
  18. //                resultMap.put(fileName, 0); // пока что записываем только имена
  19. //            }
  20. //        } catch (IOException ignored) {
  21. //
  22. //        }
  23.         resultMap = new HashMap<>() {
  24.             {
  25.                 put("0", new ArrayList<>());
  26.                 put("1", new ArrayList<>());
  27.                 put("2", new ArrayList<>());
  28.                 put("3", new ArrayList<>());
  29.             }
  30.         };
  31.  
  32.         byte[][] mocks = {
  33.                 {1, 2, 3},
  34.                 {4, 5, 6},
  35.                 {7, 8, 9},
  36.                 {10, 11, 12},
  37.                 {13, 14, 15}
  38.         };
  39.  
  40.         Thread[] threads = new Thread[5];
  41.         // запускаем нити
  42.         for (int mockIndex = 0; mockIndex < 3; mockIndex++) {
  43.             threads[mockIndex] = new ReadThread(String.valueOf(mockIndex), mocks[mockIndex]);
  44.             threads[mockIndex].start();
  45.         }
  46.         threads[3] = new ReadThread("3", mocks[3]);
  47.         threads[4] = new ReadThread("3", mocks[4]);
  48.         threads[3].start();
  49.         threads[4].start();
  50.         try {
  51.             for (Thread thread :
  52.                     threads) {
  53.                 thread.join();
  54.             }
  55.         } catch (InterruptedException ignored) {
  56.  
  57.         }
  58.  
  59.         System.out.println(resultMap);
  60.  
  61.  
  62.     }
  63.  
  64.     public static class ReadThread extends Thread {
  65.         String fileName;
  66.         byte[] mock;
  67.  
  68.         public ReadThread(String fileName, byte[] mock) {
  69.             this.fileName = fileName;
  70.             this.mock = mock;
  71.         }
  72.  
  73.         // implement file reading here - реализуйте чтение из файла тут
  74.         private byte[] fileBytes;
  75.  
  76.         @Override
  77.         public void run() {
  78.             // читаем файл в массив байт fileBytes
  79.             fileBytes = new byte[]{};
  80.             try (InputStream inputStream = new ByteArrayInputStream(mock)) {
  81.                 ByteArrayOutputStream byteArrStream = new ByteArrayOutputStream();
  82.  
  83.                 byte[] buf = new byte[1024];
  84.                 int count;
  85.  
  86.                 while ((count = inputStream.read(buf)) != -1) {
  87.                     byteArrStream.write(buf, 0, count);
  88.                 }
  89.  
  90.                 fileBytes = byteArrStream.toByteArray();
  91.             } catch (FileNotFoundException e) {
  92.  
  93.             } catch (IOException e) {
  94.  
  95.             }
  96.  
  97.             // создаем словарь byteEntries (ключи - байты из файла, значения - количество вхождений соответствующего байта в файл)
  98.             // и заполняем его байтами из файла
  99.             Map<Byte, Integer> byteEntries = new HashMap<>();
  100.             for (byte b : fileBytes) {
  101.                 byteEntries.put(b, 0); // пока что заполняем только ключи (байты)
  102.             }
  103.  
  104.             // для каждого байта вбиваем соотвутствующее ему количество вхождений в файл
  105.             for (Map.Entry<Byte, Integer> pair : byteEntries.entrySet()) {
  106.                 byte b = pair.getKey();
  107.                 int numberOfEntries = getNumberOfEntries(b);
  108.                 byteEntries.put(b, numberOfEntries);
  109.             }
  110.  
  111.             int maxValue = Collections.max(byteEntries.values()); // ищем максимальное значение в множестве количеств вхождений байтов в файл (самую большую частоту повторения)
  112.             int mostFrequentByte = (int) getKeyByValue(byteEntries, maxValue); // ищем соответствующий ему (самый часто повторяемый) байт
  113.  
  114.             // окончательно заполняем resultMap
  115. //            resultMap.put(fileName, mostFrequentByte);
  116.             synchronized (resultMap) {
  117.                 resultMap.get(fileName).add(mostFrequentByte);
  118.             }
  119.         }
  120.  
  121.         // возвращает количество вхождений в файл байта, переданного параметром
  122.         private int getNumberOfEntries(byte byteFromFile) {
  123.             int numberOfEntries = 0;
  124.  
  125.             for (byte b : fileBytes) {
  126.                 if (b == byteFromFile) {
  127.                     numberOfEntries++;
  128.                 }
  129.             }
  130.  
  131.             return numberOfEntries;
  132.         }
  133.  
  134.         // для данной map возвращает ключ (key) по соответствующему ему значению (value)
  135.         // в общем случае ключей с одинаковым значением может быть больше одного
  136.         // не юзать больше этот метод
  137.         // однако в данной задаче для более менее большого файла маловероятно, что самых часто встречаемых байтов будет больше одного
  138.         private <K, V> K getKeyByValue(Map<K, V> map, V value) {
  139.             K key = null;
  140.  
  141.             for (Map.Entry<K, V> pair : map.entrySet()) {
  142.                 if (pair.getValue().equals(value)) {
  143.                     key = pair.getKey();
  144.                 }
  145.             }
  146.  
  147.             return key;
  148.         }
  149.     }
  150. }
Advertisement
Add Comment
Please, Sign In to add comment