2014-10-20 97 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许多插槽如何有效。