比较 Swift 中的两个元组列表是否重复
Comparing Two Lists of Tuples in Swift for duplicates
我先说我正在使用 Swift 1.2。我目前正在研究广度优先搜索算法,我以前用其他语言(例如 javaScript 或 python 实现过该算法。
一般来说,在编写 BFS 代码时,我喜欢拥有三个东西:队列、已访问节点和临时可行走节点。每次迭代我都会用当前评估的节点形成可能的可行走节点。为了避免在我的访问列表和队列列表中出现重复,我将我的访问列表(它跟踪曾经访问过的每个节点)与 walkable
进行了比较
我目前的队列工作正常,我已经调试并得出结论,我在已访问的元组数组和可行走的元组数组之间查找重复项的混乱实现无法正常工作。
我真正要求的是一种优雅的方式来找到这两者之间的重复项...
var visited: [(x: Int, y: Int)] = []
var Walkable = checkForWalkable(gridFile, Eval) // returns list of tuples that are walkable
outputs:
Checked for walkable: [(28, 22), (27, 21), (28, 20), (29, 21)]
visited: [(28, 22), (28, 23), (27, 22), (28, 21), (29, 22), (28, 24),(27, 23), (29, 23), (26, 22), (27, 21)]
New List: [(27, 21), (29, 21)]
Current Queue: [(28, 21), (29, 22), (28, 24), (27, 23), (29, 23), (26, 22), (27, 21), (27, 21), (29, 21)]
上面的新列表表示能够添加的新节点(不是重复的)问题是......重复的确实被添加了。
这是我的乱码:
func findUniqeTuples(A: [(x:Int,y:Int)], B: [(Int,Int)]) -> [(Int,Int)] {
var indexArray:[Int] = []
for element in A { // visited
var count = 0
for items in B { // walkable
if element.0 == items.0 && element.1 == items.1{
indexArray.append(count)
}
count++
} // end for
}// end for
var array = B
for i in indexArray{
array.removeAtIndex(i)
}
return array
}
这是因为您要按随机顺序删除具有索引的元素。删除前面的元素会导致移动要删除的其余元素,因此索引指示错误的元素。以下内容适合您。
for (i, e) in enumerate(B) {
for items in A {
if e.0 == items.0 && e.1 == items.1 {
indexArray.append(i)
}
}
}
var array = B
for i in reverse(indexArray) {
array.removeAtIndex(i)
}
在 Swift 2.0 中,reverse
和 enumerate
现在都被定义为方法,所以它应该是:
for (i, e) in B.enumerate() { /* ... */ }
和
for i in indexArray.reverse() { /* ... */ }
我先说我正在使用 Swift 1.2。我目前正在研究广度优先搜索算法,我以前用其他语言(例如 javaScript 或 python 实现过该算法。
一般来说,在编写 BFS 代码时,我喜欢拥有三个东西:队列、已访问节点和临时可行走节点。每次迭代我都会用当前评估的节点形成可能的可行走节点。为了避免在我的访问列表和队列列表中出现重复,我将我的访问列表(它跟踪曾经访问过的每个节点)与 walkable
进行了比较我目前的队列工作正常,我已经调试并得出结论,我在已访问的元组数组和可行走的元组数组之间查找重复项的混乱实现无法正常工作。
我真正要求的是一种优雅的方式来找到这两者之间的重复项...
var visited: [(x: Int, y: Int)] = []
var Walkable = checkForWalkable(gridFile, Eval) // returns list of tuples that are walkable
outputs:
Checked for walkable: [(28, 22), (27, 21), (28, 20), (29, 21)]
visited: [(28, 22), (28, 23), (27, 22), (28, 21), (29, 22), (28, 24),(27, 23), (29, 23), (26, 22), (27, 21)]
New List: [(27, 21), (29, 21)]
Current Queue: [(28, 21), (29, 22), (28, 24), (27, 23), (29, 23), (26, 22), (27, 21), (27, 21), (29, 21)]
上面的新列表表示能够添加的新节点(不是重复的)问题是......重复的确实被添加了。 这是我的乱码:
func findUniqeTuples(A: [(x:Int,y:Int)], B: [(Int,Int)]) -> [(Int,Int)] {
var indexArray:[Int] = []
for element in A { // visited
var count = 0
for items in B { // walkable
if element.0 == items.0 && element.1 == items.1{
indexArray.append(count)
}
count++
} // end for
}// end for
var array = B
for i in indexArray{
array.removeAtIndex(i)
}
return array
}
这是因为您要按随机顺序删除具有索引的元素。删除前面的元素会导致移动要删除的其余元素,因此索引指示错误的元素。以下内容适合您。
for (i, e) in enumerate(B) {
for items in A {
if e.0 == items.0 && e.1 == items.1 {
indexArray.append(i)
}
}
}
var array = B
for i in reverse(indexArray) {
array.removeAtIndex(i)
}
在 Swift 2.0 中,reverse
和 enumerate
现在都被定义为方法,所以它应该是:
for (i, e) in B.enumerate() { /* ... */ }
和
for i in indexArray.reverse() { /* ... */ }