数据结构:数组

数据结构:数组Go

1.简介

数组内存中的一段连续的空间。
在增加元素时,如果数组空间不够保存,重新创建一个原数组2倍容量的数组,并将原数组数据拷贝过来,最后在末尾添加需要保存的数据。

2.图示

array

3.演示

package array

import "errors"

var (
	ErrIndexOut = errors.New("Index out error ")
)

const (
	// 默认长度
	defaultLength = 8
	// 扩容,当空间不够时扩容比率
	rate = 2
)

// Array go实现数组
type Array struct {
	data   []interface{}
	length int
}

func NewArray(objs ...interface{}) *Array {
	arr := new(Array)
	for _, obj := range objs {
		arr.Append(obj)
	}
	return arr
}

// 懒初始化
func (a *Array) lazy() {
	if a.data == nil {
		a.data = make([]interface{}, defaultLength, defaultLength)
		a.length = 0
	}
}

// 扩容
func (a *Array) capacityExpansion() {
	capacity := cap(a.data) * rate
	newData := make([]interface{}, capacity, capacity)
	for i, v := range a.data {
		newData[i] = v
	}
	a.data = newData
}

// Append 增
func (a *Array) Append(obj interface{}) {
	a.lazy()
	if a.length == cap(a.data) {
		// 扩容
		a.capacityExpansion()
	}
	a.data[a.length] = obj
	a.length++
}

// Delete 删除
func (a *Array) Delete(index int) {
	if a.length <= index {
		panic(ErrIndexOut)
	}
	for i := index; i < a.length-1; i++ {
		a.data[i] = a.data[i+1]
	}
	a.length--
}

// Set 改
func (a *Array) Set(index int, obj interface{}) {
	if a.length <= index {
		panic(ErrIndexOut)
	}

	a.data[index] = obj
}

// Get 查
func (a *Array) Get(index int) interface{} {
	if a.length <= index {
		panic(ErrIndexOut)
	}

	return a.data[index]
}

func (a *Array) Len() int {
	return a.length
}

func (a *Array) Cap() int {
	return cap(a.data)
}

func (a *Array) ForEach(cb func(index int, obj interface{}) bool) {
	for i := 0; i < a.length; i++ {
		if !cb(i, a.data[i]) {
			break
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yimtcode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值