记go语言实现n维数组
package ndimarr
type Element int
type Array struct {
Elements []Element
Dim []int
HelperConstants []int
}
func calOffset(arr *Array, dim ...int) (int, bool) {
offset := 0
for i := 0; i < len(dim); i++ {
if dim[i] < 0 {
return -1, false
}
offset += dim[i] * arr.HelperConstants[i]
}
return offset, true
}
func (arr *Array)Create(dim ...int) bool {
arr.Dim = make([]int, len(dim))
totalElements := 1
for i := 0; i < len(dim); i++ {
if dim[i] < 0 {
return false
}
totalElements *= dim[i]
arr.Dim[i] = dim[i]
}
arr.Elements = make([]Element, totalElements)
arr.HelperConstants = make([]int, len(dim))
arr.HelperConstants[len(arr.HelperConstants) - 1] = 1
for i := len(arr.HelperConstants) - 2; i >= 0; i-- {
arr.HelperConstants[i] = arr.HelperConstants[i + 1] * arr.Dim[i + 1]
}
return true
}
func (arr *Array)Get(dim ...int) (Element, bool) {
offset, ok := calOffset(arr, dim...)
if ok {
return arr.Elements[offset], true
} else {
return 0, false
}
}
func (arr *Array)Set(e Element, dim ...int) bool {
offset, ok := calOffset(arr, dim...)
if ok {
arr.Elements[offset] = e
return true
} else {
return false
}
}