我有一个场景,其中有两个元组数组。
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)
}
}
这是正确的方法还是有更好的方法?
答案 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)
应更改为score
和date1
的真实类型/类。
另外,如果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 对象。