在Swift中比较两个元组列表是否重复

时间:2015-12-02 05:44:29

标签: ios swift algorithm breadth-first-search

我会先说我正在使用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
}

1 个答案:

答案 0 :(得分:0)

这是因为您要按随机顺序删除带索引的元素。删除前面的元素会导致移除要移除的其余元素,因此索引指示错误的元素。以下内容适合您。

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() { /* ... */ }