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

时间:2018-01-13 08:25:53

标签: ios swift duplicates nsmutablearray

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", "", ""]

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

5 个答案:

答案 0 :(得分:1)

您的代码会计算不同重复项的数量。在您的情况下,所有四个重复项彼此相同 - 即空字符串""

如果要计算具有重复项的对象总数,请将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, +)

以上代码生成totalDups的{​​{1}}。

您计算唯一重复项的代码可以简化为一行,如下所示:

4

答案 1 :(得分:1)

  

首先停止使用i = 0 while i < n: j = 0 while j < m: # do something in while loop for j j += 1 # do something in while loop for i i += 1 并使用Swift数组。

所以你有这个数组

NSMutableArray

现在你可以检查是否有重复只是写

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 时才有效。

答案 2 :(得分:1)

SWIFT 4

肯定有更好的方法可以做到这一点,但我有一个用于解决此类问题的方法

经过测试,您可以将此代码粘贴到游乐场以获得即时结果

    // 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)

答案 3 :(得分:0)

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

在代码中,重复的值是“”。

为了便于理解,您可以更改值数组,然后重试。

答案 4 :(得分: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
  }
}