Swift - 在列表中查找重复元素

5
我有以下UITextField列表:
let list = [(name1TextField, phone1TextField), (name2TextField, phone2TextField), (name3TextField, phone3TextField), (name4TextField, phone4TextField), (name5TextField, phone5TextField)]

我正在尝试查找电话号码的重复项并将其打印出来。 编辑 例如(元组可能为空):
list = [("john", "555-444-333"), ("james", "555-444-333"), ("",""), ("bob", "333-222-111"), ("nancy", "222-111-444"), ]

output 555-444-333

我该怎么做呢?


什么是手机重复? - Eric
这个列表是否与那些UI控件硬连接? - thyago stall
@Eric:请查看编辑。 - Mono.WTF
@thyagostall:是的,它就是。 - Mono.WTF
1
嗨,请查看此链接:https://dev59.com/ml0a5IYBdhLWcg3w-8_a - Chandan kumar
4个回答

3
鉴于此情况,

var name1TextField: UITextField!
var phone1TextField: UITextField!
var name2TextField: UITextField!
var phone2TextField: UITextField!
var name3TextField: UITextField!
var phone3TextField: UITextField!
var name4TextField: UITextField!
var phone4TextField: UITextField!
var name5TextField: UITextField!
var phone5TextField: UITextField!

同时,这个

let list = [(name1TextField, phone1TextField), (name2TextField, phone2TextField), (name3TextField, phone3TextField), (name4TextField, phone4TextField), (name5TextField, phone5TextField)]

解决方案

let repeatedPhones = list
    .flatMap { $0.1?.text }
    .reduce([String:Int]()) { (var dict, phone) -> [String:Int] in
        dict[phone] = (dict[phone] ?? 0) + 1
        return dict
    }
    .filter { $0.1 > 1 && !$0.0.isEmpty }
    .map { $0.0 }

很好的解决方案,但元组可能为空,如果发生这种情况,您的代码将打印“”,我该如何才能仅在其中有元素时打印输出? - Mono.WTF
@Mono.WTF:完成了,我将 filter.filter { $0.1 > 1 } 改为了 .filter { $0.1 > 1 && !$0.0.isEmpty }。如果现在对你来说可以正常工作,请告诉我。 - Luca Angeletti
请更新代码,因为在 var dict 上出现了错误:var 参数已被弃用,并将在 Swift 3 中被移除。 - Mono.WTF

1

使用 dictionary 记录电话号码出现的次数:

var dict = [String: Int]()

然后遍历整个列表:

for (_, phone) in list {

    if let count = dict[phone] {
        dict[phone] = count + 1
    } else {
        dict[phone] = 1
    }
}

在此之后,您将拥有一个包含电话号码及其出现次数的字典,该字典包含在list中。
for item in dict {
    if item.1 > 1 {
        print(item.0)
    }
}

这个方法的时间复杂度为:O(2n)
而且这个问题看起来像是 使用Swift查找数组中的重复元素 的副本。

0
你可以创建一个最后元组项的列表,然后将它们添加到新数组中时,检查它们是否已经包含在数组中。 类似这样的代码:
func processList(list) -> String {
     var bufferArray[String] = []
     for (int i = 0; i < list.size; i++) {
          if !(bufferArray.contains( list[i].1 )) {
               bufferArray.add(list[i].1)
          else {
             return list[i].1
          }
      }
}

0
我会做以下的事情:
var duplicates = []
var set = Set<String>()

for tuple in list {
    if set.contains(tuple.phoneTextField.text) {
        duplicates.append(tuple.phoneTextField.text)
    } else {
        set.insert(tuple.phoneTextField.text)
    }
}

最后,您可以随意处理duplicates数组。

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