如何检查数组中是否有重复的值?

4
var arrEmails = NSMutableArray()
arrEmails = ["a.a@gmail.com", "a.a1@gmail.com", "a.a@gmail.com", "b.b@gmail.com", "c.c@gmail.com", "a.a1@gmail.com"]

这是我的数组,我想检查是否存在重复的值。为此我编写了以下代码:

let set = NSCountedSet.init(array: arrEmails as! [Any])
        var duplicates: Int = 0

        for var object in set {
            if set.count(for: object) > 1 {
                duplicates = duplicates+1
            }
        }

但是在上面的代码中,如果数组包含以下值,则会返回重复的值1。
arrEmails = ["a.a@gmail.com", "", "", "b.b@gmail.com", "", ""]

我不想删除重复值,我只想检查数组中重复值的数量。如何检查?请帮帮我。


没错,"" 是数组中唯一的重复值。 - Martin R
我想忽略那个 ""。 - Pankil
你可以更改内容数组以便更好地理解! - Madhur
5个回答

9

首先停止使用NSMutableArray,改用Swift数组。

所以你有这个数组:

let emails = ["a.a@gmail.com", "a.a1@gmail.com", "a.a@gmail.com", "b.b@gmail.com", "c.c@gmail.com", "a.a1@gmail.com"]

现在,你可以简单地写下以下内容来检查是否有重复项:
let hasDuplicates = emails.count != Set(emails).count

注意,仅当数组的通用类型为Hashable时,此方法才有效。

最佳方式。简单而干净。 - L.William

2
您的代码计算了“不同”的重复项数量。在您的情况下,所有四个重复项都是相同的 - 即空字符串""
如果要计算具有重复项的对象的总数,请将从set.count(for: object)返回的值相加:
let arrEmails = ["a.a@gmail.com", "", "", "b.b@gmail.com", "", ""]
let set = NSCountedSet.init(array: arrEmails as! [Any])
let totalDups = set.map { set.count(for: $0) }.filter {$0 > 1}.reduce(0, +)

上面的代码产生了4个totalDups。
计算唯一重复项的代码可以简化为以下一行:
let uniqueDups = set.map { set.count(for: $0) }.filter {$0 > 1}.count

1

SWIFT 4

肯定有更好的方法来解决这个问题,但我有一个用来解决这种问题的方法

这是经过测试的,您可以将此代码粘贴到Playground中以获得即时结果

    // here we can store dulicate elements in array
    var storeDuplicateValue =  [String:Int]()
    let arrEmails = ["a.a@gmail.com", "", "", "b.b@gmail.com", "", "","b.b@gmail.com"]
        var count = 0
       // here we loop through all elements
        for email in arrEmails {
          if(email != ""){
        count = 0
         for newEmail in arrEmails {
       if(email == newEmail){
          count += 1

        }
    }
    // if count is more than 1 we have duplicate elements
    if(count > 1){
        // so we store duplicate elements in dictionary and its count to know how many times it has been repeated
        storeDuplicateValue.updateValue(count, forKey: email)
    }
}
}

print(storeDuplicateValue)
// here we get count of keys in dictionary to know number of duplicate strings
print(storeDuplicateValue.keys.count)

0

正如其他答案所述,您的代码是正确的。如果唯一的问题是应该忽略空字符串,那么在计算重复项之前,您可以从数组中过滤掉它们:

let emails = ["a.a@gmail.com", "", "", "b.b@gmail.com", "", ""]
let emailsWithoutEmptyStrings = emails.filter { $0 != "" }
let set = NSCountedSet(array: emailsWithoutEmptyStrings)
var duplicates = 0

for object in set {
  if set.count(for: object) > 1 {
    duplicates += 1
  }
}

0

你的代码很好!而且你得到了正确和预期的结果!

就像你的代码一样,重复的值是“ ”。

为了更好地理解,你可以改变值的数组,然后再试一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接