Задачу я решила через массив, но это вторая версия решения, которая не работала. В файл записывалась абракадабра.
Если на печать выводить элементы списка, то, при чтении посимвольно число 3.1 считывается "3", ".", "1", то есть косяк в том, что я неправильно считываю элементы в список. Как я могу поправить такой вариант решения, чтобы все работало?
Условие:
Округление чисел
Считать с консоли 2 имени файла.
Первый файл содержит вещественные(дробные) числа, разделенные пробелом. Например, 3.1415.
Округлить числа до целых и записать через пробел во второй файл.
Закрыть потоки.
Принцип округления:
3.49 => 3
3.50 => 4
3.51 => 4
-3.49 => -3
-3.50 => -3
-3.51 => -4
Requirements:
1. Программа должна два раза считать имена файлов с консоли.
2. Для первого файла создай поток для чтения. Для второго - поток для записи.
3. Считать числа из первого файла, округлить их и записать через пробел во второй.
4. Должны соблюдаться принципы округления, указанные в задании.
5. Созданные для файлов потоки должны быть закрыты.
Решение
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileName1 = reader.readLine();
String fileName2 = reader.readLine();
ArrayList<String> strings = new ArrayList<>();
try (FileReader fileInput = new FileReader(fileName1);
FileWriter fileOuput = new FileWriter(fileName2)) {
while (fileInput.ready()) {
char ch = (char) fileInput.read();
strings.add(Character.toString(ch));
}
for (int i = 0; i < strings.size(); i++) {
if (strings.get(i).equals(" ")) {
strings.remove(strings.get(i));
}
}
for (String s: strings
) {
System.out.print(s + " ");
}
System.out.println();
for (int i = 0; i <strings.size(); i++) {
try {
double dataD = Double.parseDouble(strings.get(i));
System.out.print(dataD + " ");
long data = (long) Math.round(dataD);
fileOuput.write(data + " ");
} catch (NumberFormatException e) {
}
}
}
Ruth
28 уровень
Что не так в данном решении?
Обсуждается
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Всеволод БулатовBackend Developer в МЦ Сервис
6 февраля 2022, 17:19
Я в своём решении сначала формировал строку, пока не попадётся либо пробел, либо символ переноса строки. Потом уже получившуюся строку добавлял в список. И по новой, пока файл не считается полностью.
0
ГоффMaster
6 февраля 2022, 13:09
А ты бы приложила задачу и решение, тогда бы было о чём говорить ;-)
0
Ruth
6 февраля 2022, 13:16
Я отредактировала вопрос и добавила решение)
0
ГоффMaster
6 февраля 2022, 13:28
Два варианта вижу:
1. Считать через баффередридер, посплитить по пробелу, пропарсить элементы и округлить их, потом вывести. Если не учитывать на этом этапе подводных камней, то самый простой способ.
2. Считать вот как ты, посимвольно, потом ловить то, что между пробелом и точкой, преобразовывать это в число и смотреть первый символ после точки, если 5-9, то добавлять к числу единицу. Этот сложнее и считывать файлы посимвольно без буфера - плохо.
0
ГоффMaster
6 февраля 2022, 13:30
А, есть ещё третий!
Читать как ты, посимвольно, добавляя символ в строку (СтрингБильдер), если он не пробел. Если пробел - пропаристь получившуюся строку, округлить число и вывести.
0