数组中的某些字符串与另一个数组匹配

时间:2017-06-05 13:45:11

标签: arrays swift

我无法弄清楚如何让一个数组与整个数组相匹配,我想假装我们不知道usersInData [0,1,2,3]是一样的VerifiedUsers [0,1,2,3],我想以某种方式匹配相同的值,而不使用每个数组的索引。

我试过了 -

var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]

var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]

if usersInData == verifiedUsers {
    print("special user")
} else {
    print("regular user") 
}

但它会打印常规用户"所以基本上它没有用。 我希望经过验证的用户与普通用户不同。所以例如用户"你好"获得一个特殊的验证图标等等。谢谢!

5 个答案:

答案 0 :(得分:2)

这就是你想要的东西吗?

var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]

var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]

for user in usersInData {
    if verifiedUsers.contains(where: { $0 == user } )
        print("\(user) is a special user")
    } else {
        print("\(user) is a regular user")
    }
}

答案 1 :(得分:1)

我不太确定你在这里寻找什么。

var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]
var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]

如果您想知道verifiedUsersusersInData是否有任何共同点。

if !Set(verifiedUsers).isDisjoint(with: usersInData) {
    print("special user")
} else {
    print("regular user") 
}

如果您想知道verifiedUsers中的每个元素是否都在usersInData

if Set(verifiedUsers).isSubset(of: usersInData) {
    print("special user")
} else {
    print("regular user") 
}

if Set(usersInData).isSuperset(of: verifiedUsers) {
    print("special user")
} else {
    print("regular user") 
}

如果您想知道usersInData是否包含子序列verifiedUsers,那么这有点诡计。

for i in usersInData.startIndex ..< usersInData.endIndex - verifiedUsers.count {
    if verifiedUsers.elementsEqual(usersInData[i ..< i + verifiedUsers.count]) {
        print("special user")
        break
    }
}

我确信对后续问题有更好的答案。

<强>更新

受到@iLandes API的启发,我添加了我的后续测试。

extension Array where Element: Equatable {
    func hasSubsequence(_ other: Array) -> Bool {
        for i in startIndex ..< endIndex - other.count {
            if other.elementsEqual(self[i ..< i + other.count]) {
                return true
            }
        }

        return false
    }
}

if usersInData.hasSubsequence(verifiedUsers) {
    print("special user")
} else {
    print("regular user") 
}

答案 2 :(得分:0)

你必须使用contains:func contains(_ element:String) - &gt;布尔。不幸的是,这个函数的默认实现只比较了一个元素。

你必须扩展Array并创建func containsArray(array:[Element]) - &gt;布尔。

我们这样做:

extension Array where Element: Equatable {
    func containsArray(array: [Element]) -> Bool {
        return !array.contains { !self.contains($0) }
    }
}

如何在代码中使用它:

var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]
var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]


if usersInData.containsArray(array: verifiedUsers) {
    print("Special user")
} else {

    print("Regular user")
}

答案 3 :(得分:0)

我知道您想知道两个数组中存在哪个值。

我们可以使用Sets来查找它们,如数学中Set Theory所知。

您正在寻找的是 Intersection - 在两个元素集中都可以找到一个元素。数学符号:A ∩ B

let usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]
let verifiedUsers = ["hello", "hello1", "hello2", "hello3", "hello1212"]
let verifiedUsersInData = Array(Set(usersInData).intersection(verifiedUsers))
print(verifiedUsersInData)

输出:

["hello3", "hello", "hello2", "hello1"]

你可以看到结果数组的顺序不是两个输入数组。这是因为套装没有订购概念。

如果维护订单对您很重要,您有几种选择:

  • 通过将顺序与其中一个输入数组进行比较来对结果数组进行排序,
  • 将输入数组中的值包装在一个具有权重值的类型中,按顺序排序结果数组,而不是解包,
  • 使用NSOrderedSet,它保留订单但不适用于swift类型,
  • 在线查找有序集合实施。我没有任何建议,但你应该选择一个承诺具有我们在套装中使用的相同BigO特征。

答案 4 :(得分:0)

var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]
    var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]

    for user in usersInData {
        if verifiedUsers.contains(user){
        print("\(user) is a special user")
    } else {
        print("\(user) is a regular user")
    }
    }

试试这个。它会工作