メモリ内でハイパーグラフを表現しようとしています。ネストされたマトリックス以外に、このタスクに適したデータ構造はありますか? ネストされた行列は、「ネイティブ」タイプ (
int
簡単にするために言っておきましょう) と行列の両方の要素を持つことができる行列です。これは、そのようなマトリックスの始まりです。より慣用的に見えるようにするために、コードに荒削りな部分はありますか? より慣用的に見えるようにする方法は?
コード:
package main
import "fmt"
type Matricial interface {
Put(interface{}, ...int)
Get(...int) interface{}
}
type Matrix struct {
Matricial
values map[int]interface{}
}
func NewMatrix() *Matrix {
m := &Matrix{}
m.values = make(map[int]interface{})
return m
}
func (m *Matrix) Set(atom interface{}, pos ...int) {
firstdim := pos[0]
if val, ok := m.values[firstdim]; ok {
fmt.Println("map key exists", val)
switch converted := val.(type) {
case int:
m.values[firstdim] = converted
default:
fmt.Println("ERR: unknown type: %T", val)
}
} else {
if len(pos[1:]) > 0 {
newm := NewMatrix()
m.values[firstdim] = newm
newm.Set(atom, pos[1:]...)
} else {
m.values[firstdim] = atom
}
}
}
func (m *Matrix) Get(pos ...int) interface{} {
if len(pos) == 1 {
return m.values[pos[0]]
} else {
switch accessor := m.values[pos[0]].(type) {
case Matricial:
return accessor.Get(pos[1:]...)
default:
return nil
}
}
return nil
}
func main() {
m := NewMatrix()
m.Set(42, 2, 3, 4)
m.Set(43, 0)
fmt.Println(m.Get(2, 3))
fmt.Println(m.Get(2, 3, 4))
fmt.Println(m.Get(0))
}
データ構造は、ハイパーエッジを他のハイパーエッジと接続できるようにする必要があります (つまり、ハイパーエッジをノードであるかのように処理します)。