Первый вариант просчитывает файл ~1.8 млн байт за 2.4 сек
Второй вариант я не смог дождаться пока он просчитает все байты. НО! Второй вариант валидатор принял. А первый не принимает. Говорит время выполнения слишком большое.
Может мне кто нибудь подскажет что я делаю не так?
package com.javarush.task.task18.task1803;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.*;
/*
Самые частые байты
Ввести с консоли имя файла.
Найти байт или байты с максимальным количеством повторов.
Вывести их на экран через пробел.
Закрыть поток ввода-вывода.
Требования:
1. Программа должна считывать имя файла с консоли.
2. Для чтения из файла используй поток FileInputStream.
3. В консоль через пробел должны выводиться все байты из файла с максимальным количеством повторов.
4. должны выводится в одну строку.
5. Поток чтения из файла должен быть закрыт.
*/
public class Solution {
public static void main(String[] args) throws Exception {
//Получим имя файла
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
FileInputStream fileInputStream = new FileInputStream(reader.readLine());
reader.close();
HashMap<Integer, Integer> iIHashMap = new HashMap<Integer, Integer>();
//Всё считали открыли поток засекаем время непосредственного нахождения часто встречающихся байтов
Date date = new Date();
// //**************************************************Первый вариант
// //Первый вариант просто в одном цикле сразу рассчитывает максималку и хранит в HashMap
// //Файл 1,8Мб(*.png ~1.8 млн байт) выполняется 2,4 сек
// //Но данный вариант не принимается валидатором.
// HashMap<Integer, Integer> iIHashMapMax = new HashMap<Integer, Integer>();
//
// int i;
// int max = Integer.MIN_VALUE;
//
// while ((i = fileInputStream.read()) != -1){
// int thereIsMap;
//
// try {
// thereIsMap = iIHashMap.get(i);
// } catch (Exception e) {
// thereIsMap = 0;
// }
//
// if (thereIsMap != 0)
// iIHashMap.remove(i);
//
// iIHashMap.put(i, ++thereIsMap);
//
// if (max == thereIsMap) iIHashMapMax.put(i, max);
// else if (max < thereIsMap){
// max = thereIsMap;
// iIHashMapMax.clear();
// iIHashMapMax.put(i, max);
// }
// }
//
// fileInputStream.close();
//
// for (Map.Entry<Integer, Integer> pear: iIHashMapMax.entrySet()) {
// System.out.print(pear.getKey() + " ");
// }
//**************************************************Второй вариант
//3 тупа цикла которые тратят на файл размером
//Файл 1,8Мб(*.png ~ 1.8 млн байт) выполняется
//Валидатор принимает этот вариант.... Что за?
ArrayList<Integer> list = new ArrayList<>();
while (fileInputStream.available() > 0) {
list.add(fileInputStream.read());
}
fileInputStream.close();
for (int i = 0;i <list.size(); i++) {
//И вот тут "Collections.frequency" выполняется неимоверно долго но валидатор принимает. Что за?
//Я так и не дождался пока он выполнит!
iIHashMap.put(list.get(i), Collections.frequency(list,list.get(i)));
}
int max = Integer.MIN_VALUE;
for (Map.Entry<Integer,Integer> maps:iIHashMap.entrySet()) {
if (maps.getValue() > max)
max = maps.getValue();
}
for (Map.Entry<Integer,Integer> maps:iIHashMap.entrySet()) {
if (maps.getValue().equals(max))
System.out.print(maps.getKey() + " ");
}
//**************************************************Второй вариант
//Итоговое время!
Date date2 = new Date();
System.out.println();
System.out.println("time " + (date2.getTime() - date.getTime()));
}
}