Задачу решил (кто не решил пропускайте, мне больше писать некуда, в разделе "обсуждение" никто не отвечает) Как его оптимизировать? Я чувствую, что слишком много циклов делаю. Думаю, что можно при помощи первого FOREACH можно уже все сделать, но не могу догадаться как. Помогите, пожалуйста
public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream = new FileInputStream(args[0]);
        Map<Integer,Integer> map = new HashMap<>();
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        while (fileInputStream.available()>0){
            int p = fileInputStream.read();
                if (map.containsKey(p)){
                    map.put(p,map.get(p) + 1);
                }
                else
                    map.put(p,1);
        }
        fileInputStream.close();
        int min = Integer.MAX_VALUE;
        for (Map.Entry<Integer, Integer> pair1: map.entrySet()) {
            list1.add(pair1.getKey());
            list2.add(pair1.getValue());
            }
        for (int i = 0; i < list1.size(); i++) {
            for (int j = i; j < list1.size(); j++) {
                if (list1.get(j)<list1.get(i)){
                    int m = list1.get(i);
                    list1.set(i,list1.get(j));
                    list1.set(j,m);
                    int t = list2.get(i);
                    list2.set(i,list2.get(j));
                    list2.set(j,t);
                }
            }
        }
        for (int i = 0; i < list1.size() ; i++) {
            int ft = list1.get(i);
            char tf = (char) ft;
            System.out.println(tf + " " + list2.get(i));
        }
    }

}