Собираем файл

  • 10
  • Недоступна
Собираем файл из кусочков. Считывать с консоли имена файлов. Каждый файл имеет имя: [someName].partN. Например, Lion.avi.part1, Lion.avi.part2, ..., Lion.avi.part37. Имена файлов подаются в произвольном порядке. Ввод заканчивается словом "end". В папке, где находятся все прочтенные файлы, создать фа
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (401)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Ernest Aydinov18 уровень
6 часов назад
на самом деле нам тут не нужна сортировка или какие то коллекции. Нам нужно узнать самое большое N в конце .partN. Потом в цикле от 1 до N прогнать чтение из файла i и запись в результрующий Но валику мое решение не понравилось
Евгений Черный19 уровень, Гомель
11 часов назад
Сделал так: 1.в бесконечном цикле считывал имя файла, с условием (если равно end, выход из цикла). добавлял в TreeSet 2. в цикле фор ич прогнал по списку TreeSet, где: - для каждого создавал поток чтения, записывал доступные байты в буффер. -Создал поток записи с аппенд(имя файла обрезал от окончания после последней ".") и записывал этот буфер туда. -закрыл потоки. Валик принял, но в конечный файл текст записывался корректно только из первой "части", остальные пишутся кракозябрами почему то.
вчера, 18:22
Хорошая задача. Обошлась мне в несколько каточек в доту
Artem Diachenko19 уровень, Днепр
позавчера, 10:25
Как-то сразу возникло решение, но писал пару часов, тренировался на кошках. Получилось с 1 попытки, хотя последние уровни такое далеко не всегда.
TreeSet<Integer> setParts = new TreeSet<>(); // здесь храним цифры после ".part"
String part = s.substring(s.lastIndexOf(".part") + 5);
setParts.add(Integer.parseInt(part)); // заполняем TreeSet
Никита19 уровень, Москва
суббота, 23:35
Уффф. Сделал. Работает. Валидатор не принимает readAllBytes. ок. Переделал. Работает. Ругается на необходимость буферов. ок. Переделал. Работает. Валидатор где-то углядел статические переменные (где?!!!). До этого шел +- уровень/день. На эту задачку потратил весь вечер и до сих пор не решил..
вчера, 18:18
чем дальше, тем больше способов решить задачу, тем труднее понять, какой из способов нравится Валентину больше всех😞
Сергей Старухин22 уровень, Харьков
18 февраля, 17:52
Я имена записывал в Arraylist. И сделал две сортировки. Сначала Collections.sort(). Он сортирует по строго по алфавиту. То есть получается так: part11 part2 part22. Затем пузырьковой сортировкой отсортировал по длине имени. В результате имена с коротким номером перенеслись наверх: part2 part11 part22
Lada Dreamland19 уровень, Днепр
18 февраля, 13:50
Это пока моя любимая задача) Так понравилось ее решать, даже не знаю почему) П.с. ребята, TreeSet - это вещь)
Александр20 уровень, Екатеринбург
10 февраля, 09:36
Задача не про пользователя, который засунул в папку набор файлов с пропущеной/ошибочной нумерацией, а про склеивание данных в правильно разбитых файлах. Поэтому не требуется придумывать сложную логику склеивания файлов в последовательности по возрастанию (с пропусками, с разной интерпретацией счисления) и прочее... прочее ... прочее. так - считываем, разделяем по ".part", парсим в интеджер последний элемент - его в ключи TreeMap, а полный путь в значения. Только не забываем, что в методе get у TreeMap надо начинать считать с firstKey, а не с 0. В цикле перебора значений TreeMap валидатор принял конструкцию for (int i = mapOfFiles.firstKey(); i < mapOfFiles.size() + 1; i++) { ... } Это означает, что номера принимаются идущими по-порядку.
Александр20 уровень, Екатеринбург
14 февраля, 05:00
В данной ситуации с TreeMap я шел по ключам коллекции, а не по их индексам, так что - классический for либо while
Дмитрий20 уровень, Киев
7 февраля, 17:23
Бился два вечера. Паттерны выглядели слишком громоздко. Одно из решений, приемлимое для нашего уровня:
while (!(s = reader.readLine()).equals("end")) {
key = Integer.parseInt(s.substring(s.indexOf("part") + 4));
map.put(key, s);
}
Добавляем в TreeMap. Потом вытаскиваем и записываем в наш файл.
Фантомас19 уровень, Киев
7 февраля, 10:15
Задача действительно интересная, но с двумя большими минусами: 1) Валик не принимает импорты java.nio. То есть, не принимал решение через считывание байтов таким образом: byte[] buffer = Files.readAllbytes(Paths.get(fileName)); 2) И, самый большой минус, ИМХО, пропускаются решения с неправильной сортировкой. То есть, проходят решения с обычным numeric sort, а не только с semantic sort (как должно быть). Например, обычный Collections.sort() отсортирует данные части: .part01 .part3 .part10 .part220 ...вот так: .part01 .part10 .part220 .part3 Как видите, совсем не то, если частей много. Для сортировки через semantic sorting использовал кастомный класс-компаратор из этой статьи. Создаём Set и скармливаем ему этот компаратор. Затем уже дело техники, как говорится.
Set<String> set = new TreeSet<>(new FilenameComparator());
Sergey20 уровень, Pattaya
9 февраля, 11:07
то есть вы подсовываете неправильное имя файла, но виноват в этом валидатор (принятие решение с неправильной сортировкой) ? Ведь если у вас есть, предположим, файл part220, то первый файл будет part001, а уж никак не part1 (иначе у вас все файлменеджеры тоже "неправильно сортируют")
Фантомас19 уровень, Киев
9 февраля, 15:22
Части файлов были даны в таком виде ради примеров, чтобы легче было понять как работают разные сортировки. Понятно, что перед .part1 будет .part001, но это уже могут быть два разных варианта вашего первого файла в сборке. Можно назвать первый файл .part001, и .part01, и .part1, и последующие части будут оформляться по предоставленному формату. Ну, если так настроен архиватор, по крайней мере.
Sergey20 уровень, Pattaya
9 февраля, 15:47
Надумано. Задача про другое