Этот код выводит байты из файла с минимальным количеством повторов.
Первая половина кода мне понятна, вторая вообще нет. И соответственно не знаю, что нужно изменить, чтоб вывод был с максимальным количеством повторов.
Буду очень благодарна за помощь.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
InputStream inputStream = new FileInputStream(reader.readLine());
ArrayList<Integer> list = new ArrayList<>();
Map<Integer, Integer> map = new HashMap<>();
while (inputStream.available()>0) {
int i = inputStream.read();
list.add(i);
}
inputStream.close();
for (int i = 0; i < list.size(); i++) {
int count = 0;
for (int j = 0; j < list.size(); j++) {
if (list.get(i) == list.get(j)) {
count++;
}
}
map.put(list.get(i), count++);
}
int a = 0;
for (Map.Entry<Integer, Integer> pair : map.entrySet()) {
if (a == 0) {
a = pair.getValue();
} else if (a > pair.getValue()) {
a = pair.getValue();
}
}
for (Map.Entry<Integer, Integer> entry: map.entrySet()) {
if (a == entry.getValue()) {
System.out.print(entry.getKey() + " ");
}
}
}
}
Маргарита
20 уровень
Объясните, пожалуйста, этот код.
Решен
Комментарии (9)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Павел Безумный учёный Expert
9 июня 2020, 13:02решение
Программа работает следующим образом.
1. С консоли считывается имя файла, после чего создаётся поток для считывания этого файла в виде последовательности байтов. Каждый считанный байт заносится в список list. Таким образом, после завершения считывания этот список содержит все байты исходного файла.
2. При помощи двух циклов for (внешнего и внутреннего) производится анализ списка байтов list: внешний цикл "удерживает" один из элементов списка, после чего внутренний цикл сравнивает все остальные элементы списка с "удерживаемым" элементом. При каждом совпадении значение счётчика count увеличивается на 1. По завершении работы внутреннего цикла значение count равно общему количеству найденных совпадений, то есть количеству повторов байта, "удерживаемого" внешним циклом.
Этот байт и количество его повторов заносятся в отображение map в виде [БАЙТ=КОЛИЧЕСТВО_ПОВТОРОВ].
3. Заполненное отображение map перебирается в следующем цикле for. На каждой итерации этого цикла из отображения извлекается пара КЛЮЧ=ЗНАЧЕНИЕ, и ЗНАЧЕНИЕ из этой пары (то есть количество повторов) сравнивается со значением вспомогательной переменной a (эта переменная нужна для хранения минимального найденного ЗНАЧЕНИЯ при анализе пар отображения). Если текущее ЗНАЧЕНИЕ меньше значения a, то а принимает это новое, меньшее значение. Таким образом находится наименьшее ЗНАЧЕНИЕ во всём отображении map, т. е. минимальное количество повторов.
4. Из отображения последовательно достаются все пары, ЗНАЧЕНИЕ которых равно значению переменной a (см. последний цикл). При этом КЛЮЧ каждой подходящей пары выводится в консоль.
+7
Павел Безумный учёный Expert
9 июня 2020, 13:02полезный
Чтобы программа находила все байты с максимальным количеством повторов, следует просто изменить знак на противоположный в условии определения значения вспомогательной переменной a:
+2
Маргарита
9 июня 2020, 21:13
Павел, большое Вам спасибо за пояснение. Вы все очень подробно и доступно объяснили! Я очень благодарна Вам за помощь.
0
Павел Безумный учёный Expert
9 июня 2020, 22:32
Рад, что помог! )
0
ak
10 июля 2020, 09:01
а разве в п.3 переменая а не будет иметь только одно минимальное значение после окончания цикла? по условию нужно же вывести все минимальные (или максиальные в другой задаче) значения повторов
0
Павел Безумный учёный Expert
10 июля 2020, 09:24
Последний цикл программы перебирает пары отображения map, сравнивая ЗНАЧЕНИЕ в каждой из пар со значением переменной a. Если эти значения равны, то КЛЮЧ из проверяемой пары выводится в консоль. Таким образом, цикл выведет все ключи пар отображения, значения которых равны a.
0
ak
10 июля 2020, 09:41
так у меня поэтому и вопрос. мы же не делаем список значений "а". после окончания работы предпоследнего цикла будет только одно значение а, но не список.
и в последнем цикле мы сравниваем ЗНАЧЕНИЕ каждой пары с "а". И когда находим сходство, выводим на экран. Но т.к нет списка значений а,то будет выведен только один КЛЮЧ.
Либо делать опять цикл в цикле
я что-то не так понимаю, но не пойму что))
0
Павел Безумный учёный Expert
10 июля 2020, 09:59
Отображение может содержать несколько пар с одинаковым значением. Например, имеется такое отображение:
Программа вычислит минимальное значение a, которое будет соответствовать сразу трём парам, и в консоль будут выведены ключи этих трёх пар:
0
ak
10 июля 2020, 11:38
аааа. вот так вот.
тогда да.
Спасибо! понял
0