2009-09-02 73 views
1

我想我的關聯數組索引Point(或,一般來說,Object)具有語義相等。不幸的是如何在由Point索引的actionscript中創建關聯數組?

var p:Point = new Point(1, 1); 
var q:Point = new Point(1, 1); 

var dict:Dictionary = new Dictionary(); 
dict[p] = 5; 
trace(dict[p]); // => 5 
trace(dict[q]); // => undefined 

因爲

trace(p===q); // => false 

有沒有辦法告訴Dictionary如何訂購它的鑰匙,還是有不同的類中使用了這種類型的事情?

回答

0

很顯然,如果你使用Object,似乎打算工作:

var p:Point = new Point(1, 1); 
var q:Point = new Point(1, 1); 
var r:Point = new Point(1, 2); 

var dict:Object = new Object(); 
dict[p] = 5; 
trace(dict[p]); // => 5 
trace(dict[q]); // => 5 
trace(dict[r]); // => undefined 
+0

我還沒有試過這個,這只是一個預感,但你肯定*這個工程?我懷疑它可能會在p上進行字符串轉換,然後將其用作索引,因此所有點都會發生碰撞。 – grapefrukt 2009-09-02 17:29:26

+0

我相信Object的鍵只是字符串,所以你用作鍵的任何非String對象都會被轉換爲一個字符串。 Object的toString()方法返回相同的內容,不管它的內容如何,​​所以這很可能不起作用。 – Herms 2009-09-02 18:21:37

+0

它似乎。請參閱編輯 – 2009-09-02 23:01:38

0

一個Dictionary將放置物體不同箱,即使他們是「平等」。如果用作鍵的兩個對象導致插入時發生衝突,則字典將簡單地使用下一個可用的容器來放置第二個對象,因爲如您所說,p!==q。但使用Object(本質上它仍然是一張地圖)是不同的,它只會檢查是否p.equals(q)

+0

實際上,'Object'必須*不*檢查'p == q',因爲在這種情況下,它是錯誤的! (但'p.equals(q)'是真的) – 2009-09-02 23:05:55

+0

可能已經發誓它回到我的真實。呃,沒什麼大不了的;反正不應該使用'=='。 – geowa4 2009-09-03 14:07:56