Ich versuche, den integrierten Kartentyp als eine Reihe für einen eigenen Typ (Point, in diesem Fall) zu verwenden. Das Problem ist, wenn ich der Karte einen Punkt zuweise und später einen neuen, aber gleichen Punkt erzeuge und ihn als Schlüssel verwende, verhält sich die Karte so, als wäre dieser Schlüssel nicht in der Karte. Ist das nicht möglich?Go - Verwenden einer Karte für seine Set-Eigenschaften mit benutzerdefinierten Typen
// maptest.go
package main
import "fmt"
func main() {
set := make(map[*Point]bool)
printSet(set)
set[NewPoint(0, 0)] = true
printSet(set)
set[NewPoint(0, 2)] = true
printSet(set)
_, ok := set[NewPoint(3, 3)] // not in map
if !ok {
fmt.Print("correct error code for non existent element\n")
} else {
fmt.Print("incorrect error code for non existent element\n")
}
c, ok := set[NewPoint(0, 2)] // another one just like it already in map
if ok {
fmt.Print("correct error code for existent element\n") // should get this
} else {
fmt.Print("incorrect error code for existent element\n") // get this
}
fmt.Printf("c: %t\n", c)
}
func printSet(stuff map[*Point]bool) {
fmt.Print("Set:\n")
for k, v := range stuff {
fmt.Printf("%s: %t\n", k, v)
}
}
type Point struct {
row int
col int
}
func NewPoint(r, c int) *Point {
return &Point{r, c}
}
func (p *Point) String() string {
return fmt.Sprintf("{%d, %d}", p.row, p.col)
}
func (p *Point) Eq(o *Point) bool {
return p.row == o.row && p.col == o.col
}
Eine Alternative wäre 'map [int] map [int] Point'. Erhöhte Speicherverbrauch und Zugriffszeit, aber einfacher, ein Element zu finden. –
Genau das, was ich sagen wollte. – crazy2be
Ja. 'map [int] map [int] Punkt- und andere Schemata für die Map-Schlüssel, die sich auf den Wert der Punktkoordinaten anstatt auf einen Zeiger auf eine bestimmte Instanz eines Punktes stützen, funktionieren ebenfalls. – peterSO