Пытался решить и стандартно, через for, и через forEach, можно конечно решить задачу в лоб - с кучей одним листом и проходом по нему несколько раз, но это не интересно
package com.javarush.task.task18.task1803;
/*
Самые частые байты
*/
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;
public class Solution {
volatile static Integer max = 0;
volatile static List<Byte> list = new ArrayList<>();
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader( new InputStreamReader(System.in));
Map<Byte, Integer> Ints = new HashMap<>();
String sFileName = bf.readLine();
bf.close();
BufferedInputStream bf2 = new BufferedInputStream( new FileInputStream(sFileName));
//int max = Integer.MAX_VALUE;
while (bf2.available()>0) {
byte q = (byte) bf2.read();
Ints.computeIfPresent(q, (key, val) -> val=val+1);
Ints.putIfAbsent(q, 0);
}
bf2.close();
//System.out.println(Ints);
/*Ints.forEach( (k, v) -> {
//System.out.println(k + ":"+ v);
if (v==Solution.max) {
synchronized ( this ) {
Solution.list.add(k);
}
}
if (v>Solution.max) {
synchronized (this) {
Solution.max = v;
Solution.list.clear();
Solution.list.add(k);
}
}
});*/
for(Map.Entry <Byte, Integer> x : Ints.entrySet()) {
byte k=x.getKey();
Integer v = x.getValue();
if (v==Solution.max) {
Solution.list.add(k);
}
if (v>Solution.max) {
Solution.max = v;
Solution.list.clear();
Solution.list.add(k);
}
}
Solution.list.forEach( iThis -> {
System.out.print(iThis + " ");
});
}
}