Все относительно

  • 16
  • Недоступна
Напиши программу, которая будет считывать с клавиатуры два пути и выводить в консоль относительный путь между первым и вторым путями, если он существует. В противном случае выводить ничего не нужно.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (52)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
serj3011
Уровень 19, Кривой Рог, Украина
15 января, 11:04
В противном случае выводить ничего не нужно, в том числе Exception!
Александр Огарков
Уровень 28, Мытищи, Россия
8 января, 14:10
Я хотел сравнить корни путей, и если они равны вызывать метод. Но такое решение валидатор не принимает🙅‍♂️
if (firstPath.getRoot().equals(secondPath.getRoot())) {
   ...
}
Возможно я не до конца понял, в каком случае возникает ошибка. _________________ updated Разобрался. Строка выше будет правильно работать, только если пути абсолютные, что логично, относительный путь при вызове getRoot() вернёт null. Соответственно моё решение выглядело следующим образом: 1. Проверил, являются ли пути абсолютными; 2. Если абсолютные - сравнить корни и если корни одинаковые - вызвать relativize(); 3. Если пути не абсолютные - обернуть в try-catch метод relativize(), а перехваченное исключение проигнорировать; В таком решении, если пути абсолютные, но корни разные - не будет исключения. В правильном решении сразу выполняется №3, и просто перехватывается исключение. Эта задача навела на мысли. В процессе обучения у меня сложилось устойчивое мнение, что исключение должно использоваться для обработки исключительной ситуации, и что использовать его как инструмент при нормальной работе программы не желательно. Осталось понять определение "исключительная ситуация", и когда лучше обработать if-ами, а когда try-catch. В данной микрозадаче, вероятно, предпочтительнее вариант из правильного решения. А как в больших проектах? У разработчика вырабатывается "чутьё", или есть какие-то правила?
Boriss
Уровень 19, Tallinn, Эстония
6 января, 08:47
Вот все ребята ниже говорят по возникновение Exception. Я долго не мог понять, откуда у них это вообще вылезло? Ни IntelliJ, ни валидатор на сайте не выдавали ни ошибок, ни предупреждений на эту тему. Может по-тому, что исключение unchecked? Тогда какого х... мужского полового органа это забито в валидатор? Целая лекция написана на тему, что checked исключения как-то не очень, и обрабатывать их всем лень. А тут сотни людей бьются головой об валидатор, по-тому что "гладиолус"!, и нужно догодаться обработать unchecked исключение.
Artem.A. #2833122
Уровень 18, Новосибирск, Russian Federation
16 декабря 2021, 08:46
Капец! около 10ка рабочих попыток с отказом валидатора с формулировкой: "Для вычисления относительного пути должен быть использован метод relativize() класса Path." Я голову сломал, что там может быть не так, когда это единственный метод и был. При том, что все возможные проверки и try-catch были включены. Оказалось, что я catch решил обработать с типом "IllegalArgumentException" на случай несовпадения "корня" путей как в табличке в Лекции. Как только поменял на общий Exception - всё прокатило.
Timankov
Уровень 17, Севастополь, Россия
10 января, 12:08
спасибо! такая же ерунда была с исключением)
Сергей Коваленко
Уровень 29, Краснодар
5 декабря 2021, 12:21
В правильном решении строка
System.out.println(path2.relativize(path1));
не выполняет ровным счетом ничего, кроме выбрасывания ошибки в пустой catch-блок. contains("..") решает задачу согласно условию, но валик не пропускает
Anonymous #2401903
Уровень 20, Киев
10 декабря 2021, 10:43
обновили условие
Сергей Коваленко
Уровень 29, Краснодар
10 декабря 2021, 10:54
👍🏻
Евгений
Уровень 18, Москва, Russian Federation
2 декабря 2021, 09:28
"Подсказка: если не удалось найти относительный путь между путь1 и путь2, попробуй найти относительный путь между путь2 и путь1." При каком условии относительный путь в одну сторону не существует, а в другую существует?
Sasha Dokuchaev Работает в Andersen
2 декабря 2021, 22:21
Я так понял, при условии, что у них одинаковая корневая часть, но при этом 1ый путь ещё и длинную относительную содержит Вот, например, при сравнении 1го и 2го
C:\Users\User\Downloads\Новая папка (2)
C:\Users\User\
В консоль выводит:
..\..
А при сравнении 2го с 1ым выведет:
Downloads\Новая папка (2)
Евгений
Уровень 18, Москва, Russian Federation
3 декабря 2021, 03:59
Я такой вариант проверял. Взял правильное решение, загнал в idea, но в system.out.println перед распечаткой относительного пвти выводил цифру - какой по счету try сработал . Даже если выводилось ../.. срабатывала первая проверка.
Fleser
Уровень 22, Днепр, Ukraine
3 декабря 2021, 16:42
Aleksandr Dokuchaev ответил все верно. Правильное решение, которые дают разработчики - неправильное. В их решении никогда не будет выполнятся часть условия "если не удалось найти относительный путь между путь1 и путь2, попробуй найти относительный путь между путь2 и путь1." И более того, вопреки условию задачи выводится в консоль "..\..", хотя согласно условию ничего выводится не должно. Правильное решение пока на рассмотрение Администрации, и обещали в скором времени выложить правильный вариант.
Fleser
Уровень 22, Днепр, Ukraine
28 ноября 2021, 21:44
Ну вот как можно в правильное решение выкладывать код, который возвращает "..\..", когда сами в условии задачи пишут, что если относительного пути не существует, то ничего выводить не нужно?
Mary Grimm
Уровень 35
3 декабря 2021, 12:14
тот же вопрос, при этом правильное решение которое использует больше проверок неверное
Fleser
Уровень 22, Днепр, Ukraine
3 декабря 2021, 15:44
Написал администрации. Данную задачи отправили на рассмотрение, и в ближайшее свободное время обещали все исправить
🔧Дядя Богдан🔧 ♂ Механик с ключом на 24 в Клубе ΣKALA ♂
19 декабря 2021, 16:54
так "..\.." это и есть относительный путь, например, если файл1 находится в C:\\грязныйБогдан\\слесарьМаксим\\ключНа9\\файл1.txt а файл2 в C:\\грязныйБогдан\\файл2.txt то путь к файл2 относительно файла1 будет "..\..\..\файл2.txt" , т.е. вернуться на 3 директории назад. Или если второй путь просто C:\\грязныйБогдан\\, то метод вернул бы "..\..\.." .
Path relativePath = path1.relativize(path2);
вроде так
Matthew
Уровень 24, Russian Federation
27 ноября 2021, 05:38
А может в принципе возникнуть ситуация, когда нельзя найти относительный путь между путь1 и путь2, но можно найти относительный путь между путь2 и путь1 ?
🔧Дядя Богдан🔧 ♂ Механик с ключом на 24 в Клубе ΣKALA ♂
19 декабря 2021, 17:16
если корневые разные, то нет относительного пути. если есть относительный путь из 1 в 2, то и из 2 в 1 тоже существует.
AlexGr Java Developer
17 ноября 2021, 11:54
Тоже бомбануло. пришлось нагородить всяких непонятных конструкций, что бы валидатор принял
Toko Kuchiki
Уровень 21, Russian Federation
13 ноября 2021, 12:32
Path.of(str1).relativize(Path.of(str2)); Path.of(str2).relativize(Path.of(str1)); почему так не принимает? сразу сделал как в решении, за исключением вот этого момента, и потратил ещё пол часа на поиск "что не так", пока не нажал "получить решение"
Владимир Истомин
Уровень 34, Russian Federation
23 ноября 2021, 19:06
Уважаемые разработчики задания, видимо, решили, что негоже писать в одну строчку преобразование строки в путь и применять relativize. У меня не проходил правильный код, а после того, как я вынес пути в отдельные переменные, все заработало.