Поиск массивов «не найден», даже если он найден

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

Проблема заключается в поиске массива для элемента, который соответствует некоторым входным критериям. Алгоритм в псевдокоде выглядит примерно так:

for each element of Array: if element matches criteria: do something with element maybe break out of loop (if only interested in first match) else: print "Not found" 

Этот код сообщает «Не найден», даже если он успешно находит соответствующий элемент.

One Solution collect form web for “Поиск массивов «не найден», даже если он найден”

Проблема в том, что когда вы ищете что-то линейно через массив, вы не можете знать, что он не найден, пока вы не достигнете конца массива. Код в вопросительных отчетах «Не найден» для каждого несоответствующего элемента, хотя могут быть и другие соответствующие элементы.

Простая модификация заключается в использовании переменной, которая отслеживает, находили ли вы что-то, а затем проверяете эту переменную в конце цикла.

 found = false for each element of Array: if element matches criteria: do something with element found = true maybe break out of loop (if only interested in first match) if not found: print "Not found" 

У Python есть else: block в своих циклах. Это выполняет код только в том случае, если цикл завершается, а не заканчивается из-за использования break . Это позволяет избежать found переменной (хотя она может быть полезна для последующей обработки):

 for element in someIterable: if matchesCriteria(element): print("Found") break else: print("Not found") 

Некоторые языки имеют встроенные механизмы, которые можно использовать вместо написания собственного цикла.

  • Некоторые языки имеют any или any либо функцию, которая выполняет функцию обратного вызова, и возвращает логическое значение, указывающее, удастся ли ему выполнить любые элементы массива.
  • Если язык имеет функцию фильтрации массива, вы можете фильтровать входной массив с помощью функции, которая проверяет критерии, а затем проверяет, является ли результат пустым массивом.
  • Если вы пытаетесь точно сопоставить элемент, большинство языков предоставляют функцию find или index которая будет искать соответствующий элемент.

Если вы будете часто искать, лучше преобразовать массив в структуру данных, которую можно будет искать более эффективно. Большинство языков предоставляют структуры данных hash table и / или hash table (последние относятся к множеству имен в зависимости от языка, например ассоциативный массив, карта, словарь), и они обычно доступны для поиска в O (1) раз, а при сканировании массива – O (п).

  • Является ли GUID уникальным в 100% случаев?
  • Когда бросать исключение?
  • Сколько параметров слишком много?
  • Interesting Posts

    Adobe Flash Player: PPAPI против NPAPI в Google Chrome?

    Когда использовать class-оболочку и примитивный тип

    Автозапуск блокнота, который не переключает эквиваленты tabs / notepad ++

    Как сериализовать / десериализовать словаря `из пользовательского XML, не использующего XElement?

    System.currentTimeMillis vs System.nanoTime

    Настройте Windows 7, чтобы показать все окна в черно-белом

    Почему C ++ поддерживает поэтапное назначение массивов внутри структур, но не в целом?

    Удаление OLD-файлов в winsxs

    Параметры Power Power по умолчанию, кроме Balanced, исчезли, как их восстановить?

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

    Как разрешить запуск скриптов VB на учетной записи администратора

    Сохранить все открытые окна / вкладки?

    Какова ошибка, сообщаемая для AH01757, «генерирующая секрет для аутентификации дайджеста …»?

    Как я могу заново начать новую программу?

    Как создать ярлык браузера, который откроет определенные страницы?

    Давайте будем гением компьютера.