如何检查元素是否在数组中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查元素是否在数组中相关的知识,希望对你有一定的参考价值。

在Swift中,如何检查数组中是否存在元素? Xcode对containincludehas没有任何建议,并且通过这本书的快速搜索没有任何结果。知道怎么检查这个吗?我知道有一个方法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元素序列)的协议扩展方法,而不是早期版本中的全局方法。

备注:

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

意图是:

  1. 检查数组中是否存在元素(/满足一些布尔条件,不一定是等式测试),
  2. 如果是这样,继续使用第一个这样的元素,

那么contains(_:)作为蓝图Sequence的替代品是first(where:)Sequence

let elements = [1, 2, 3, 4, 5]

if let firstSuchElement = elements.first(where:  $0 == 4 ) 
    print(firstSuchElement) // 4
    // ...

在这个人为的例子中,它的使用可能看起来很愚蠢,但是如果查询非基本元素类型的数组是否存在满足某些条件的任何元素,

以上是关于如何检查元素是否在数组中的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 Firebase Firestore 的数组中是不是存在元素?

C ++如何检查数组中的元素是不是相等?

如何使用jq检查数组中是不是存在元素

如何检查数组中的任何元素是否大于100?

如何检查数组的元素是不是存在于字符串中

如何检查文档字段类型数组中是不是存在元素?扑