我正在使用Swift 3在数组中找到一个GKGraphNode,该数组的x,y位置与目标x,y位置匹配。下面是节点的init。您可以看到每个节点都有一个名为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
}
非常感谢任何帮助。
答案 0 :(得分:0)
如果节点的网格位置没有动态变化,则可以保留节点字典而不是(或除此之外)数组。如果网格具有固定(或最大)宽度或高度,则可以将x,y坐标转换为单个整数值,以用作字典中的键。否则你可以使用两级字典。
然后访问节点将是O(1)操作而不是O(n / 2)。