搜索数组报告 "not found",即使已找到
Searching array reports "not found" even though it's found
这是一个针对逻辑错误的通用问答,我在各种语言的新程序员提出的许多问题中都看到过。
问题是在数组中搜索与某些输入条件匹配的元素。该算法在伪代码中看起来像这样:
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"
此代码报告 "Not found" 即使成功找到匹配元素。
问题是,当您在数组中线性搜索某物时,您直到到达数组末尾才知道它没有找到。问题中的代码报告每个不匹配的元素 "Not found",即使可能有其他匹配元素。
简单的修改是使用一个变量来跟踪你是否找到了什么,然后在循环结束时检查这个变量。
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 在其 for
循环中有一个 else:
块。这仅在循环运行完成时才执行代码,而不是由于使用 break
而结束。这允许您避免 found
变量(尽管它可能对以后的处理仍然有用):
for element in someIterable:
if matchesCriteria(element):
print("Found")
break
else:
print("Not found")
某些语言具有内置机制,可以使用这些机制而不是编写自己的循环。
- 有些语言有一个
any
或 some
函数,它接受一个回调函数,returns 一个布尔值,指示它是否对数组的任何元素成功。
- 如果语言有数组过滤功能,可以用检查条件的函数过滤输入数组,然后检查结果是否为空数组。
- 如果您尝试精确匹配元素,大多数语言都提供
find
或 index
函数来搜索匹配元素。
如果您要经常搜索,最好将数组转换为可以更有效地搜索的数据结构。大多数语言提供 set
and/or hash table
数据结构(后者根据语言有很多名称,例如关联数组、映射、字典),这些通常可以在 O(1 ) 时间,而扫描数组是 O(n).
这是一个针对逻辑错误的通用问答,我在各种语言的新程序员提出的许多问题中都看到过。
问题是在数组中搜索与某些输入条件匹配的元素。该算法在伪代码中看起来像这样:
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"
此代码报告 "Not found" 即使成功找到匹配元素。
问题是,当您在数组中线性搜索某物时,您直到到达数组末尾才知道它没有找到。问题中的代码报告每个不匹配的元素 "Not found",即使可能有其他匹配元素。
简单的修改是使用一个变量来跟踪你是否找到了什么,然后在循环结束时检查这个变量。
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 在其 for
循环中有一个 else:
块。这仅在循环运行完成时才执行代码,而不是由于使用 break
而结束。这允许您避免 found
变量(尽管它可能对以后的处理仍然有用):
for element in someIterable:
if matchesCriteria(element):
print("Found")
break
else:
print("Not found")
某些语言具有内置机制,可以使用这些机制而不是编写自己的循环。
- 有些语言有一个
any
或some
函数,它接受一个回调函数,returns 一个布尔值,指示它是否对数组的任何元素成功。 - 如果语言有数组过滤功能,可以用检查条件的函数过滤输入数组,然后检查结果是否为空数组。
- 如果您尝试精确匹配元素,大多数语言都提供
find
或index
函数来搜索匹配元素。
如果您要经常搜索,最好将数组转换为可以更有效地搜索的数据结构。大多数语言提供 set
and/or hash table
数据结构(后者根据语言有很多名称,例如关联数组、映射、字典),这些通常可以在 O(1 ) 时间,而扫描数组是 O(n).