簡體   English   中英

快速有效的方法來搜索數組以查找不同類型的匹配項

[英]swift more efficient way to search array for match of different types

我正在使用Swift 3在具有與目標x,y位置匹配的ax,y位置的數組中找到GKGraphNode。 以下是節點的初始化。 您可以看到每個節點都有一個名為gridPosition的vector_int2坐標。 我創建這些節點的數組以匹配地圖的六邊形網格。

class HexGraphNode : GKGraphNode {
var gridPosition: vector_int2!

required init(gridPosition: vector_int2) {
    super.init()

    self.gridPosition = gridPosition

}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

}

我需要能夠搜索此數組以找到占用某些特定網格坐標的節點。 我正在使用下面的功能。 當地圖較小(例如少於500個節點)時,此功能可以正常工作。 但是,隨着數組的增長,程序會變慢到無法接受的地步。 我需要一種更有效的方法來搜索數組並找到匹配的節點,而不必每次都從索引零開始。 我在尋找其他貼子,但是它們似乎總是在比較相同類型的對象。 在這種情況下,我需要將對象的屬性(node.position)與其他類型(包含x,y整數的vector_int2)進行比較。

func node(atGridPosition position: vector_int2) -> NodeType {

    var result: NodeType!

    for node in self.nodes as! [NodeType] {

        if node.gridPosition.x == position.x && node.gridPosition.y == position.y {
            result = node

            break
        }
    }

    return result
}

任何幫助將不勝感激。

如果節點的網格位置沒有動態變化,則可以保留節點字典,而不是(或除此以外)對數組進行排列。 如果您的網格具有固定(或最大)的寬度或高度,則可以將x,y坐標轉換為單個整數值,以用作字典中的鍵。 否則,您可以使用兩級字典。

這樣,訪問節點將是O(1)操作,而不是O(n / 2)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM