如何检查元素是否在数组中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查元素是否在数组中相关的知识,希望对你有一定的参考价值。
在Swift中,如何检查数组中是否存在元素? Xcode对contain
,include
或has
没有任何建议,并且通过这本书的快速搜索没有任何结果。知道怎么检查这个吗?我知道有一个方法find
返回索引号,但是有一个方法返回像ruby的#include?
这样的布尔值吗?
我需要的例子:
var elements = [1,2,3,4,5]
if elements.contains(5)
//do something
斯威夫特2,3,4,5:
let elements = [1, 2, 3, 4, 5]
if elements.contains(5)
print("yes")
contains()
是SequenceType
(用于Equatable
元素序列)的协议扩展方法,而不是早期版本中的全局方法。
备注:
- 这种
contains()
方法要求序列元素采用Equatable
协议,比较例如Andrews's answer。 - 如果序列元素是
NSObject
子类的实例,那么你必须覆盖isEqual:
,参见NSObject subclass in Swift: hash vs hashValue, isEqual vs ==。 - 还有另一种 - 更通用的 -
contains()
方法,它不要求元素是等同的并且将谓词作为参数,参见例如Shorthand to test if an object exists in an array for Swift?。
Swift旧版本:
let elements = [1,2,3,4,5]
if contains(elements, 5)
println("yes")
这是我刚写的一个小扩展,用于检查我的委托数组是否包含委托对象(Swift 2)。 :)它也适用于像魅力这样的值类型。
extension Array
func containsObject(object: Any) -> Bool
if let anObject: AnyObject = object as? AnyObject
for obj in self
if let anObj: AnyObject = obj as? AnyObject
if anObj === anObject return true
return false
如果您知道如何优化此代码,请告诉我。
Swift 4,另一种实现此目的的方法,具有过滤功能
var elements = [1,2,3,4,5]
if let object = elements.filter( $0 == 5 ).first
print("found")
else
print("not found")
如果用户找到特定的数组元素,则使用下面与整数值相同的代码。
var arrelemnts = ["sachin", "test", "test1", "test3"]
if arrelemnts.contains("test")
print("found") else
print("not found")
迅速
如果您没有使用对象,那么您可以使用此代码进行包含。
let elements = [ 10, 20, 30, 40, 50]
if elements.contains(50)
print("true")
如果你在swift中使用NSObject类。这个变量是根据我的要求。你可以修改你的要求。
var cliectScreenList = [ATModelLeadInfo]()
var cliectScreenSelectedObject: ATModelLeadInfo!
这适用于相同的数据类型。
$0.user_id == cliectScreenSelectedObject.user_id
如果你想AnyObject类型。
"\($0.user_id)" == "\(cliectScreenSelectedObject.user_id)"
完整的条件
if cliectScreenSelected.contains( $0.user_id == cliectScreenSelectedObject.user_id ) == false
cliectScreenSelected.append(cliectScreenSelectedObject)
print("Object Added")
else
print("Object already exists")
那么为这个工作使用哈希表怎么样?
首先,创建一个“哈希映射”泛型函数,扩展Sequence协议。
extension Sequence where Element: Hashable
func hashMap() -> [Element: Int]
var dict: [Element: Int] = [:]
for (i, value) in self.enumerated()
dict[value] = i
return dict
只要数组中的项符合Hashable,就像整数或字符串一样,此扩展名将起作用,这里的用法是......
let numbers = Array(0...50)
let hashMappedNumbers = numbers.hashMap()
let numToDetect = 35
let indexOfnumToDetect = hashMappedNumbers[numToDetect] // returns the index of the item and if all the elements in the array are different, it will work to get the index of the object!
print(indexOfnumToDetect) // prints 35
但是现在,让我们只关注元素是否在数组中。
let numExists = indexOfnumToDetect != nil // if the key does not exist
means the number is not contained in the collection.
print(numExists) // prints true
Array
let elements = [1, 2, 3, 4, 5, 5]
Check elements presence
elements.contains(5) // true
Get elements index
elements.firstIndex(of: 5) // 4
elements.firstIndex(of: 10) // nil
Get element count
let results = elements.filter element in element == 5
results.count // 2
Swift 4.2 + 您可以通过以下函数轻松验证您的实例是否为数组。
func verifyIsObjectOfAnArray<T>(_ object: T) -> Bool
if let _ = object as? [T]
return true
return false
.
即使您可以按如下方式访问它。如果对象不是数组,您将收到Nil
。
func verifyIsObjectOfAnArray<T>(_ object: T) -> [T]?
if let array = object as? [T]
return array
return nil
对于那些来这里寻找查找并从数组中删除对象的人:
斯威夫特1
if let index = find(itemList, item)
itemList.removeAtIndex(index)
斯威夫特2
if let index = itemList.indexOf(item)
itemList.removeAtIndex(index)
斯威夫特3,4,5
if let index = itemList.index(of: item)
itemList.remove(at: index)
使用此扩展程序:
extension Array
func contains<T where T : Equatable>(obj: T) -> Bool
return self.filter($0 as? T == obj).count > 0
用于:
array.contains(1)
更新了Swift 2/3
请注意,从Swift 3(甚至2)开始,不再需要扩展,因为全局contains
函数已经在Array
上被制作成一对扩展方法,它允许您执行以下任一操作:
let a = [ 1, 2, 3, 4 ]
a.contains(2) // => true, only usable if Element : Equatable
a.contains $0 < 1 // => false
如果要检查数组中是否包含自定义类或结构的实例,则需要先实现Equatable协议,然后才能使用.contains(myObject)。
例如:
struct Cup: Equatable
let filled:Bool
static func ==(lhs:Cup, rhs:Cup) -> Bool // Implement Equatable
return lhs.filled == rhs.filled
然后你可以这样做:
cupArray.contains(myCup)
提示:== override应该在全局级别,而不是在您的类/ struct中
我用过滤器。
let results = elements.filter el in el == 5
if results.count > 0
// any matching items are in results
else
// not found
如果你愿意,你可以压缩它
if elements.filter( el in el == 5 ).count > 0
希望有所帮助。
Swift 2的更新
Hurray用于默认实现!
if elements.contains(5)
// any matching items are in results
else
// not found
(斯威夫特3)
Check if an element exists in an array (fulfilling some criteria), and if so, proceed working with the first such element
意图是:
- 检查数组中是否存在元素(/满足一些布尔条件,不一定是等式测试),
- 如果是这样,继续使用第一个这样的元素,
那么contains(_:)
作为蓝图Sequence
的替代品是first(where:)
的Sequence
:
let elements = [1, 2, 3, 4, 5]
if let firstSuchElement = elements.first(where: $0 == 4 )
print(firstSuchElement) // 4
// ...
在这个人为的例子中,它的使用可能看起来很愚蠢,但是如果查询非基本元素类型的数组是否存在满足某些条件的任何元素,
以上是关于如何检查元素是否在数组中的主要内容,如果未能解决你的问题,请参考以下文章