Нас просят закрыть FileInputStream, но не BufferedReader.Поэтому предлагаю закрывать все потоки и принимать это как хорошую привычку при работе с ними:
String fileName;
try(BufferedReader in = new BufferedReader(new InputStreamReader(System.in))){
fileName = in.readLine();
}
И нам не обязательно нужна какая-то еще дополнительная коллекция(resultList как в решении у многих), так как если мы знаем максимальное/минимальное число повторов, то просто бежим по базовой коллекции и выводим те биты, которые имеют это же значение.
В последней задаче не обязательно нужен TreeSet, но повторить коллекции будет полезно
Прайсы 2.
Не понял требование из-за которого мой код не проходил - Товар с измененными данными должен находиться на той же строке в файле. Имеется ввиду, что если описание занимало 2 перевода строки, то обновленное описание тоже должно иметь 2 энтера? Иначе, у меня все соответствовало условиям, т.е. моя обновленная строка всегда начиналась на той же строке, только у меня один перевод строки в конце.
Если входной файл такой
19846 Шорты пляжные
синие 159.00 12
198479 Шорты пляжные черные с
рисунко173.00 17
19847983Куртка для сноубордистов,
разм10173.991234
то после запуска с таким параметром -u 198479 "Труселя чорные чоткие" 200 2
он становился таким
А зато все основные коллекции вспомнил 😁 ("Самые частые байты"):
try (FileInputStream fis = new FileInputStream(new Scanner(System.in).nextLine()))
{
// Считываем все байты из файла в список
List<Byte> list = new ArrayList<>();
while (fis.available() > 0)
list.add((byte) fis.read());
// Понимаем из каких уникальных элементов/байтов состоит наш список/файл
Set<Byte> byteSet = new HashSet<>(list);
/* Выясняем сколько раз каждый из элементов встречается в списке/файле
и удобненько сохраняем эту инфу в мапу */
HashMap<Byte, Integer> map = new HashMap<>();
for(Byte b: byteSet){
map.put(b, Collections.frequency(list,b));
}
// Выясняем максимальное количество повторов элемента
int maxValue = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getValue();
// Выводим те элементы, количество повторов которых соответствует максимальному
map.entrySet().stream()
.filter(e -> e.getValue().equals(maxValue))
.forEach(e -> System.out.print(e.getKey() + " "));
}
Последнюю задачу решил через старый добрый ArrayList с проверкой перед добавлением list.contains(i). Потом две строчки
Collections.sort(list);
list.forEach(s -> System.out.print(s+ " "));
Кстати, как могли заметить, в задачах выводятся ASCII коды символов (e.g. 97), а не сами символы(e.g. a). И в правильных решениях - тоже.
А сами символы мне удалось вывести, например, так:
for (Integer resultItem : resultList) {
// System.out.print(resultItem + " ");
char chr = (char) resultItem.intValue();
System.out.print(chr + " ");
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ