模拟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()
}
}