gpt4 book ai didi

ios - 比较 Swift 中两个元组列表的重复项

转载 作者:行者123 更新时间:2023-11-30 13:52:56 31 4
gpt4 key购买 nike

我会先说我正在使用 Swift 1.2。我目前正在研究广度优先搜索算法,我之前已经用其他语言(例如 javaScript 或 python)实现过该算法。

一般来说,当我编码 BFS 时,我喜欢有三件事:队列、已访问节点和临时可步行节点。每次迭代我都会与当前评估的节点形成可能的可步行节点。为了避免我的访问列表和队列列表中出现重复,我将我的访问列表(它跟踪曾经访问过的每个节点)与可步行列表进行比较

我目前的队列工作正常,我已经调试并得出结论,在访问的元组数组和可行走的元组数组之间查找重复项的困惑实现无法正常工作。

我真正要求的是一种优雅的方式来查找这两者之间的重复项......

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 中,reverseenumerate 现在都定义为方法,因此应该是:

for (i, e) in B.enumerate() { /* ... */ }

for i in indexArray.reverse() { /* ... */ }

关于ios - 比较 Swift 中两个元组列表的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34035715/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com