Swift-根据两个元组​​数组的值联接

时间:2018-09-25 09:15:29

标签: arrays swift tuples swift4

我有一个场景,其中有两个元组数组。

tuple1 = [(score1, index1), (score2, index2), (score3, index3)]
tuple2 = [(date1, index1), (date2, index2), (date3, index4)]

我想从这些元组中获取分数和日期,并创建一个新的元组数组,使其包含具有相同索引的分数和日期,如下所示:

tuple3 = [(score1, date1), (score2, date2)]

我该如何实现?在这种情况下可以遵循的最佳实践是什么? 注意:数组的大小可以不同

我对该方案的实现如下:

var tuple3 = [(Double, Date)]()
    for (i,psa) in tuple1.enumerated() {

        let date = tuple2.filter({ $0.1 == i })

        if date.count == 1 {
            let newTuple = (tuple1.0, date[0].0)
            tuple3.append(newTuple)
        }
    }

这是正确的方法还是有更好的方法?

4 个答案:

答案 0 :(得分:2)

您可以尝试

let v1 = [("1","2"),("3","4")]

let v2 = [("1A","2A"),("3A","4A")]

let res = zip(v1,v2).map { ($0.0 , $1.0) } // [("1", "1A"), ("3", "3A")]

print(res)

答案 1 :(得分:2)

let tuple1 = [("score1", "index1"), ("score2", "index2"), ("score3", "index3")]
let tuple2 = [("date1", "index1"), ("date2", "index2"), ("date3", "index4")]

let t2Dict = tuple2.reduce(into: [String:String]()) { (dict, args) in
    let (date, index) = args
    dict[index] = date
}

let tuple3 = tuple1.compactMap { args -> (String, String)? in
    let (score, index) = args
    guard let date = t2Dict[index] else { return nil }
    return (score, date)
}

它不像其他的那么漂亮,但是将其中一个元组首先折叠成字典的效率要高得多。

答案 2 :(得分:0)

这应该可以解决问题:

let tuple3 = tuple1.compactMap({  (scoreInTuple1, indexInTuple1) -> (String, String)? in
    if let tupleIn2 = tuple2.first(where: { (scoreInTuple2, index2InTuple2) in index2InTuple2 == indexInTuple1 }){
        return (scoreInTuple1, tupleIn2.0)
    }
    return nil
})

(String, String)应更改为scoredate1的真实类型/类。 另外,如果index2InTuple2 == indexInTuple1的自定义类型/类可能不是Equatable,也可能会更改。

之前带有示例代码:

let tuple1 = [("score1", "index1"), ("score2", "index2"), ("score3", "index3")]
let tuple2 = [("date1", "index1"), ("date2", "index2"), ("date3", "index4")]

在以下时间调试日志:

print("tuple3: \(tuple3)")

输出:

$> tuple3: [("score1", "date1"), ("score2", "date2")]

答案 3 :(得分:0)

这可能是您想要的:

let tuple1 = [("score1", "index1"), ("score2", "index2"), ("score3", "index3")]
let tuple2 = [("date1", "index1"), ("date2", "index2"), ("date3", "index4")]

let filtered = tuple1.filter {tuple2.map{$0.1}.contains($0.1)}
let result = filtered.map {tuple in
    return (tuple.0, tuple2.first(where: {$0.1 == tuple.1})!.0)
}

print (result)  // [("score1", "date1"), ("score2", "date2")]

为了简单起见,我使用的是Strings,只需确保在元组中使用了 Equatable 对象。