Одному знакомому дали такое задание на экзамене:
Дан абсолютный путь для файла(Unix-style) - необходимо упростить его.
Принятые обозначения:
/ - переход в папку;
.. - переход к на шаг выше по каталогу;
. - остаться в текущем каталоге.
Пример пути для файла и результат упрощения:
1. (/home/ -> /home), 2. (/a/./b/../../c -> /c)
Он не смог решить. Мне показывает, я тоже не смог, потому что не понял суть вопроса, ну вот никак.
Сейчас нашел ответ:
private String homePath(String pathString) {
Stack<String> stack = new Stack<>();
int i = 0;
StringBuilder w = new StringBuilder();
while (i < pathString.length()) {
if (pathString.charAt(i) == '/') {
updateStack(w.toString(), stack);
w = new StringBuilder();
} else {
w.append(pathString.charAt(i));
}
i++;
}
updateStack(w.toString(), stack);
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()) {
sb.insert(0, "/" + stack.pop());
}
if (sb.toString().equals("")){
return "/";
} else {
return sb.toString();
}
}
private static void updateStack(String w, Stack<String> stack) {
if (w.equals("..") && !stack.isEmpty()) {
stack.pop();
}
if (!w.equals(".") && !w.equals("") && !w.equals("..")) {
stack.push(w);
}
}
Я понимаю путь обычный, юниксовский.
Но вот мне не понятно, что значит упростить? Зачем?
Что значит упростить?
Значит, представить абсолютный путь к файлу в самом коротком виде. Используя .
и ..
, путь к одному и тому же файлу можно указать бесконечным множеством разных способов. Например:
/a/b/c
/a/./b/c
/a/./b/./c
/a/b/../b/c
/a/../a/./b/../b/c
Все эти пути указывают на один и тот же файл.
Зачем?
Затем, что короткий путь - самый читаемый. А ещё оптимизация пути к файлу - это отличная задачка на использование стэка.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Использую SharedPreference для настроек приложения, есть единственное но, как сделать чтобы SharedPrefernce можно было вызвать из любого активити?
Система следующаяЗагружаются данные из курсора в ресайклер