算法:golang实现动态数组

模拟java中的arraylist

在这里插入图片描述

实现arrayList

package arrayList

import (
	"errors"
	"fmt"
)

type List interface {
	Append(value... interface{})(error)
	Remove(index int)(interface{}, error)
}

// golang的结构体中不可能有默认值
type ArrayList struct {
	size int
	elementData []interface{}
}



func NewArrayList() *ArrayList  {
	list := new(ArrayList)
	list.size = 0;
	list.elementData = make([]interface{}, 0, 1);
	return list
}

func (list *ArrayList)Get(index int) (interface{}, error)  {
	// 先检查是不是超出范围
	if index < 0 || index >= list.size {
		return nil, errors.New("超出索引范围")
	}


	return list.elementData[index], nil
}

func (list *ArrayList)Set(index int, value interface{}) ( error)  {
	// 先检查是不是超出范围
	if index < 0 || index >= list.size {
		return errors.New("超出索引范围")
	}


	list.elementData[index] = value;
	return  nil
}

func (list *ArrayList)Clear() {
	list.elementData = make([]interface{}, 0)
	list.size = 0;
}
func (list *ArrayList)ToString() string {
	return fmt.Sprint(list)
}

func (list *ArrayList) Append(value ...interface{}) error {
	// 他会自动扩容
	for _, v := range value{
		list.elementData = append(list.elementData, v)
		list.size++;
	}

	return nil
}

func (List *ArrayList) Remove(index int) (interface{}, error){
	// 先检查是不是超出范围
	if index < 0 || index >= List.size {
		return nil, errors.New("超出索引范围")
	}

	oldValue := List.elementData[index];

	//怎么赋值一个数组
	List.elementData = append(List.elementData[:index], List.elementData[index+1:]...)
	List.size--;

	return oldValue, nil
}

func (List *ArrayList) Insert(index int, value interface{}) (error){
	// 先检查是不是超出范围
	if index < 0 || index > List.size {
		return  errors.New("超出索引范围")
	}

	// 将所有元素后移动一位
	List.elementData = append(List.elementData, value)
	List.size++;
	for i := List.size - 1; i > index ; i-- {
		List.elementData[i] = List.elementData[i-1];
	}
	List.elementData[index] = value


	return nil
}

实现数组迭代器

package arrayList

import (
	"errors"
)

type Iterator interface {
	HashNext() bool
	Next() (interface{}, error)
	Remove() (error)
}

type Iterable interface {
	Iterator() Iterator
}

type ArraylistIterator struct {
	list *ArrayList
	cursor int
	lastRet int;
}




func (a *ArraylistIterator) Next() (interface{}, error) {
	i := a.cursor
	if i >= a.list.size {
		return nil, errors.New("没有这样的索引")
	}

	a.cursor = a.cursor + 1;
	a.lastRet = i
	return a.list.elementData[a.lastRet], nil;
}



func (a *ArraylistIterator) Remove() error {
	if a.lastRet == -1 {
		return errors.New("不允许这样使用")
	}

	_, err := a.list.Remove(a.lastRet)
	if err != nil {
		 return err
	}
	a.cursor = a.lastRet
	a.lastRet = -1;

	return nil
}

func (a *ArraylistIterator) HashNext() bool {
	return a.cursor != a.list.size
}


// 实现了Iterable 就必须实现Iterator定义上的接口
func (list *ArrayList) Iterator() Iterator  {
	return &ArraylistIterator{
		list:    list,
		cursor:  0,
		lastRet: 0,
	}
}





测试

package main

import (
	"aa/arrayList"
	"fmt"
)


func main() {
	var list arrayList.List = arrayList.NewArrayList();
	list.Append(1)


	var newArrayList *arrayList.ArrayList = arrayList.NewArrayList()

	for i := 0; i < 10 ; i++ {
		newArrayList.Append(1)
		newArrayList.Append(2)
		newArrayList.Append(3);
		newArrayList.Append(4);

	}


	fmt.Println(newArrayList)
	newArrayList.Set(0, 100)
	fmt.Println(newArrayList.ToString())
	newArrayList.Insert(0, 0);
	fmt.Println(newArrayList.ToString())
	newArrayList.Insert(41, 41);
	fmt.Println(newArrayList.ToString())
	newArrayList.Insert(1, 111);
	fmt.Println(newArrayList.ToString())
	it := newArrayList.Iterator()
	
	for  it.HashNext() {
		fmt.Println(it.Next())
		it.Remove()
	}


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值