Относительный путь (алгоритм)

153
07 июня 2018, 10:00

Одному знакомому дали такое задание на экзамене:

Дан абсолютный путь для файла(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);
    }
}

Я понимаю путь обычный, юниксовский.

Но вот мне не понятно, что значит упростить? Зачем?

Answer 1

Что значит упростить?

Значит, представить абсолютный путь к файлу в самом коротком виде. Используя . и .., путь к одному и тому же файлу можно указать бесконечным множеством разных способов. Например:

/a/b/c
/a/./b/c
/a/./b/./c
/a/b/../b/c
/a/../a/./b/../b/c

Все эти пути указывают на один и тот же файл.

Зачем?

Затем, что короткий путь - самый читаемый. А ещё оптимизация пути к файлу - это отличная задачка на использование стэка.

READ ALSO
Проблемы с генерированием апк

Проблемы с генерированием апк

На устройстве занимался отладкой приложенияЗатем удалил его

144
SharedPrefernces на несколько активити

SharedPrefernces на несколько активити

Использую SharedPreference для настроек приложения, есть единственное но, как сделать чтобы SharedPrefernce можно было вызвать из любого активити?

179
ClickListener при работе со списком из курсора

ClickListener при работе со списком из курсора

Система следующаяЗагружаются данные из курсора в ресайклер

202