Некоторые из других ответов имели бы низкую производительность на очень больших массивах, потому что методы как removeObject:
и removeObjectsInArray:
включают выполнение линейного поиска получателя, который является отходами, потому что Вы уже знаете, где объект. Кроме того, любой вызов к removeObjectAtIndex:
должен будет скопировать значения с индекса до конца массива одним слотом за один раз.
более эффективный было бы следующим:
NSMutableArray *array = ...
NSMutableArray *itemsToKeep = [NSMutableArray arrayWithCapacity:[array count]];
for (id object in array) {
if (! shouldRemove(object)) {
[itemsToKeep addObject:object];
}
}
[array setArray:itemsToKeep];
, поскольку мы устанавливаем способность itemsToKeep
, мы не тратим впустую значений копирования времени во время изменения размеры. Мы не изменяем массив на месте, таким образом, мы свободны использовать Быстрое Перечисление. Используя setArray:
для замены содержания array
с itemsToKeep
будет эффективно. В зависимости от Вашего кода Вы могли даже заменить последнюю строку:
[array release];
array = [itemsToKeep retain];
, Таким образом, нет даже потребности скопировать значения, только подкачайте указатель.
find . -type d | sort | awk '$0 !~ last "/" {print last} {last=$0} END {print last}'
Я не могу придумать ничего, что могло бы сделать это без цикла. Итак, вот несколько циклов:
Это отображает конечные каталоги в текущем каталоге, независимо от их глубины:
for dir in $(find -depth -type d); do [[ ! $prev =~ $dir ]] && echo "$dir" ; prev="$dir"; done
Эта версия правильно обрабатывает имена каталогов, содержащие пробелы:
saveIFS=$IFS; IFS=$'\n'; for dir in $(find -depth -type d ); do [[ ! $prev =~ $dir ]] && echo "${dir}" ; prev="$dir"; done; IFS=$saveIFS
Вот версия, использующая Jefromi :
find -depth -type d | while read dir; do [[ ! $prev =~ $dir ]] && echo "${dir}" ; prev="$dir"; done
Вот скрипт Python , который действительно работает . Недавно мне пришлось сделать то же самое!
) \)
- конечная группа захвата \ /
- косая черта (/) (экранированная с помощью \
) . *
- ноль или более любого символа \ n
- новая строка \ 1
- копия обратной ссылки (в данном случае это все, что было между началом строки и последней косой чертой) $
- соответствует концу строки /
- завершает шаблон Если вы ищете что-то визуальное, tree -d
подойдет.
drinks |-- coke | |-- cherry | `-- diet | |-- caffeine-free | `-- cherry |-- juice | `-- orange | `-- homestyle | `-- quart `-- pepsi |-- clear `-- diet
Я думаю, вы можете просмотреть все каталоги, а затем перенаправить вывод и использовать xargs для подсчета количества файлов для каждого подкаталога, когда нет подкаталога (xargs find SUBDIR -type d | wc - л ... что-то в этом роде, я не могу сейчас проверить) вы нашли лист.
Это все еще цикл.