2017-06-13 20 views
0

我正在尋找一種方法來防止數組重複引用同一個對象。我不是說重複的值 - 那很好。我怎樣才能防止對數組中類對象的重複引用?

例如,我知道在Apple的SpriteKit框架中,一個SKNode對象將其子節點存儲在一個數組(var children: [SKNode])中,並且向父節點添加一個節點兩次會導致程序崩潰。

let parent = SKNode() 
let child1 = SKNode() 
let child2 = SKNode() 
parent.addChild(child1) 
parent.addChild(child2) // Allowed, although child2 == child1. 
parent.addChild(child1) // Causes a crash. 

這是我想要模仿的行爲的確切類型。我將如何管理這個?如果不需要比較每個參考的O(n)複雜性,是否可能?

回答

1

我不知道到底爲什麼你會想這樣做,但這裏是你如何去這樣做:

... 

var childReferences = Set<ObjectIdentifier> 

private func validateUniqueness(_ node: SKNode) { 
    guard childReferences.insert(ObjectIdentifier(node)).inserted else { 
     fatalError("An attempt was made to add a duplicate child") 
    } 
} 

override func addChild(_ node: SKNode) { 
    validateUniqueness(node) 
    super.addChild(node) 
} 

override func insertChild(_ node: SKNode at index: Int) { 
    validateUniqueness(node) 
    super.insertChild(node, at: index) 
} 

override func removeChildren(in nodes: [SKNode]) { 
    childReferences.subtract(nodes) 
    super.removeChildren(in nodes: [SKNode]) 
} 

override func removeAllChildren() { 
    childReferences.removeAll(keepingCapacity: false) 
    super.removeAllChildren() 
} 
+0

我覺得OP問是否可以做到這一點不爲O(n )複雜性。但是你只是使用一個'set',它只是在添加之前檢查重複項,所以最壞情況的複雜度仍然是O(n)。 – ebby94

+1

@ ebby94'Sets'中的查找是'O(1)'。 – Alexander

+0

不知道。但是'Set'查找O(1)怎麼樣?使用下標進行訪問具有O(1)複雜性,但是查找重複項應該具有O(n)複雜性嗎?任何解釋這個的鏈接都會很酷:) – ebby94

相關問題