数组实现 by golang
This commit is contained in:
parent
4d1525b9a1
commit
574bc4b99a
91
go/05_array/array.go
Normal file
91
go/05_array/array.go
Normal file
@ -0,0 +1,91 @@
|
||||
package _5_array
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
/**
|
||||
* 1) 数组的插入、删除、按照下标随机访问操作;
|
||||
* 2)数组中的数据是int类型的;
|
||||
*
|
||||
* Author: leo
|
||||
*/
|
||||
|
||||
type Array struct {
|
||||
data []int
|
||||
length uint
|
||||
}
|
||||
|
||||
//为数组初始化内存
|
||||
func NewArray(capacity uint) *Array {
|
||||
if capacity == 0 {
|
||||
return nil
|
||||
}
|
||||
return &Array{
|
||||
data: make([]int, capacity, capacity),
|
||||
length: 0,
|
||||
}
|
||||
}
|
||||
|
||||
func (this *Array) Len() uint {
|
||||
return this.length
|
||||
}
|
||||
|
||||
func (this *Array) isIndexOutOfRange(index uint) bool {
|
||||
if this.length != 0 && index > this.length {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
//通过索引查找数组,索引范围[0,n-1]
|
||||
func (this *Array) Find(index uint) (int, error) {
|
||||
if this.isIndexOutOfRange(index) {
|
||||
return 0, errors.New("out of index range")
|
||||
}
|
||||
return this.data[index], nil
|
||||
}
|
||||
|
||||
//插入数值到索引index上
|
||||
func (this *Array) Insert(index uint, v int) error {
|
||||
if this.Len() == uint(cap(this.data)) {
|
||||
return errors.New("full array")
|
||||
}
|
||||
if this.isIndexOutOfRange(index) {
|
||||
return errors.New("out of index range")
|
||||
}
|
||||
|
||||
for i := this.length; i > index; i-- {
|
||||
this.data[i] = this.data[i-1]
|
||||
}
|
||||
this.data[index] = v
|
||||
this.length++
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *Array) InsertToTail(v int) error {
|
||||
return this.Insert(this.Len(), v)
|
||||
}
|
||||
|
||||
//删除索引index上的值
|
||||
func (this *Array) Delete(index uint) (int, error) {
|
||||
if this.isIndexOutOfRange(index) {
|
||||
return 0, errors.New("out of index range")
|
||||
}
|
||||
v := this.data[index]
|
||||
for i := index; i < this.Len()-1; i++ {
|
||||
this.data[i] = this.data[i+1]
|
||||
}
|
||||
this.length--
|
||||
return v, nil
|
||||
}
|
||||
|
||||
//打印数列
|
||||
func (this *Array) Print() {
|
||||
var format string
|
||||
for i := uint(0); i < this.Len(); i++ {
|
||||
format += fmt.Sprintf("|%+v", this.data[i])
|
||||
}
|
||||
fmt.Println(format)
|
||||
}
|
59
go/05_array/array_test.go
Normal file
59
go/05_array/array_test.go
Normal file
@ -0,0 +1,59 @@
|
||||
package _5_array
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestInsert(t *testing.T) {
|
||||
capacity := 10
|
||||
arr := NewArray(uint(capacity))
|
||||
for i := 0; i < capacity-2; i++ {
|
||||
err := arr.Insert(uint(i), i+1)
|
||||
if nil != err {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
}
|
||||
arr.Print()
|
||||
|
||||
arr.Insert(uint(6), 999)
|
||||
arr.Print()
|
||||
|
||||
arr.InsertToTail(666)
|
||||
arr.Print()
|
||||
}
|
||||
|
||||
func TestDelete(t *testing.T) {
|
||||
capacity := 10
|
||||
arr := NewArray(uint(capacity))
|
||||
for i := 0; i < capacity; i++ {
|
||||
err := arr.Insert(uint(i), i+1)
|
||||
if nil != err {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
}
|
||||
arr.Print()
|
||||
|
||||
for i := 9; i >= 0; i-- {
|
||||
_, err := arr.Delete(uint(i))
|
||||
if nil != err {
|
||||
t.Fatal(err)
|
||||
}
|
||||
arr.Print()
|
||||
}
|
||||
}
|
||||
|
||||
func TestFind(t *testing.T) {
|
||||
capacity := 10
|
||||
arr := NewArray(uint(capacity))
|
||||
for i := 0; i < capacity; i++ {
|
||||
err := arr.Insert(uint(i), i+1)
|
||||
if nil != err {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
}
|
||||
arr.Print()
|
||||
|
||||
t.Log(arr.Find(0))
|
||||
t.Log(arr.Find(9))
|
||||
t.Log(arr.Find(11))
|
||||
}
|
Loading…
Reference in New Issue
Block a user