2021-07-31

记go语言实现n维数组

package ndimarr

type Element int

// Array 任意维度的数组
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
}

// Create 创建指定维度的数组
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))
	// 辅助常量数组的最后一个数据元素的值是1
	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
}

// Get 返回数组指定位置上的数据元素
func (arr *Array)Get(dim ...int) (Element, bool) {
	offset, ok := calOffset(arr, dim...)
	if ok {
		return arr.Elements[offset], true
	} else {
		return 0, false
	}
}

// Set 修改数组上指定位置的数据元素,如果修改成功返回true,否则返回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
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值