Nano Hash - криптовалюты, майнинг, программирование

Фильтрация путей к файлам с помощью NSPredicate

Я пытаюсь отфильтровать массив путей к файлам формата [число]_[число].png и получить только те, которые начинаются с определенного числа, скажем, 1.

Вот что я пробовал:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                            @"self MATCHES '%@/1_[0-9]+.png'",
                            [[[NSBundle mainBundle] resourcePath]
                                stringByAppendingPathComponent:@"Images"]];

NSArray *files = [[[NSBundle mainBundle] pathsForResourcesOfType:@"png"
                                         inDirectory:@"Images"] 
                     filteredArrayUsingPredicate:predicate];

Я получаю пустой массив. Я попытался использовать LIKE вместо MATCHES. Я пытался использовать флаги [cd], хотя это не должно иметь значения. Тем не менее я всегда получаю пустой массив. Это что-то с регулярным выражением?


Редактировать:

Похоже, проблема была с predicateWithFormat.

Я думал, что он получает строку формата, за которой следуют аргументы для замены в строку формата. Это так не работает. Он игнорирует аргументы, и в строке формата ничего не заменяется.

Итак, решение следующее:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          [NSString stringWithFormat:
                           @"self MATCHES '%@/1_[0-9]+.png'",
                           [[[NSBundle mainBundle] resourcePath]
                              stringByAppendingPathComponent:@"Images"]]];

NSArray *files = [[[NSBundle mainBundle] pathsForResourcesOfType:@"png"
                                         inDirectory:@"Images"] 
                    filteredArrayUsingPredicate:predicate];

Ответы:


1

Похоже, проблема заключается в конфликте между первой и второй строками кода. Первая строка устанавливает ваш NSPredicate, поэтому он отформатирован следующим образом:

Images/1_#.png

Во второй строке вы говорите iOS искать ваш предикат внутри каталога Images. При этом ваш окончательный предикат/путь выглядит так:

Images/Images/1_#.png

Удалите часть NSPredicate, которая добавляет каталог Images/ в начало предиката.

Проблема, которую я описал выше, может быть и не проблемой. Другая возможная проблема с кодом заключается в том, что ваш формат предиката неверен. В исходном коде вы забыли добавить + после 1 в свой NSPredicate (вы сделали это после [0-9], но не 1).

Ваш код должен выглядеть примерно так:

NSString *filter = @"1+_[0-9]+.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"self MATCHES %@", filter];
NSArray *files = [[[NSBundle mainBundle] pathsForResourcesOfType:@"png" inDirectory:@"Images"] filteredArrayUsingPredicate:predicate];

Когда я тестирую приведенный выше код в своем приложении, NSPredicate успешно фильтрует NSString.

Вы также можете просмотреть эту ссылку: http://useyourloaf.com/blog/2010/07/27/filtering-arrays-with-nspredicate.html

02.03.2013
  • @ Ata01 Да, MATCHES — это то, что вы ищете в этом сценарии. Я отредактировал свой ответ - пожалуйста, проверьте отредактированный код в конце. Я также добавил еще одно возможное объяснение. 02.03.2013
  • Я пробовал предикат со знаком плюс после «1» и без него, и он не работает в обоих случаях. Я не думаю, что использование знака «плюс» в моем случае правильно, поскольку мне нужно ровно одно появление цифры «1», а не одно или несколько. Я попытался использовать код, на который вы ссылаетесь, и он работает, но он принимает только имена файлов и выполняет их фильтрацию. Так что я могу сделать это так. Удалите пути, отфильтруйте имена файлов, затем добавьте полные пути обратно, но, если это возможно, я хотел бы выполнить фильтрацию полных путей. 02.03.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..