2014-10-20 62 views
1

我試圖實現玩具搜索算法,並需要維護一組探索狀態。狀態是一個結構:包含切片的結構集

type VWState struct { 
    botLocation VWCoords 
    dirtLocations []VWCoords 
} 

我首先想到的是,一組簡單的可以用map[VWState]bool實現,但我似乎無法想出一個辦法,使工作。如果我嘗試使用VWState作爲重點的地圖,我得到如下的恐慌:

Panic: runtime error: hash of unhashable type vw.VWState (PC=0x40EB0D) 

有沒有一種方法,使這項工作?我可以爲結構實現一個自定義哈希函數嗎,還是我應該查看其他一些方法來實現?

任何幫助將不勝感激。

回答

2

可以使用的一個指針結構爲地圖鍵:

map[*VWState]bool 

如果你希望能夠比較等價結構,你可以創建一個方法來輸出地圖的關鍵。 String()會很方便,因爲你也可以用它來打印你的結構,或者綁定一個散列函數並輸出更短的東西,即使是int

東西這麼簡單就足夠了,但你可以讓你喜歡的(注意不要遞歸調用String()在格式線)輸出短:

func (s VWState) String() string { 
    return fmt.Sprintf("%#v", s) 
} 

func main() { 
    m := make(map[string]bool) 
    s := VWState{} 
    m[s.String()] = true 
} 
+0

這個改變使得它可以編譯,但是我認爲這會使用指針本身的散列,因此不會檢測到兩個具有等同內容的不同結構實例嗎? 如果是這樣,有什麼辦法來實現這種行爲? – vlthr 2014-10-20 22:08:59

+0

是的,這是正確的。如果您希望等效結構具有相同的密鑰,則需要提供某種方法來生成該密鑰。 – JimB 2014-10-20 22:13:06

+0

您是否知道該語言是否提供了實現該行爲的任何工具,以便它能與內置地圖一起工作?在Java的'hashCode()'或Python的'__hash __()'方面,或者我應該使用'map [int] bool'並在插入前手動提取哈希? – vlthr 2014-10-20 22:23:13

1

如果有一個明智的最大長度對於dirtLocations,那麼你可以使用數組而不是片。數組是可散列的(只要元素是可散列的)。

type VWState struct { 
    botLocation VWCoords 
    dirtLocations [4]VWCoords 
} 

然後您就需要以添加的有效dirtLocations數的計數或檢測VWCoords零值制定出在dirtLocations許多插槽如何有效。