github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/algorithm/datastructures/array/array.go (about)

     1  package array
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  )
     8  
     9  /**
    10   * 1)数组的插入、删除、按照下标随机访问操作
    11   */
    12  type Array struct {
    13  	data   []interface{}
    14  	length uint
    15  }
    16  
    17  func New(capacity uint) *Array {
    18  	if capacity == 0 {
    19  		return nil
    20  	}
    21  
    22  	return &Array{
    23  		data: make([]interface{}, capacity, capacity),
    24  	}
    25  }
    26  
    27  func (this *Array) Len() uint {
    28  	return this.length
    29  }
    30  
    31  func (this *Array) isIndexOutOfRange(index uint) bool {
    32  	if index > uint(cap(this.data)) {
    33  		return true
    34  	}
    35  	return false
    36  }
    37  
    38  //通过索引查找数组,索引范围[0,n-1]
    39  func (this *Array) Find(index uint) (interface{}, error) {
    40  	if this.isIndexOutOfRange(index) {
    41  		return 0, errors.New("out of index range")
    42  	}
    43  	return this.data[index], nil
    44  }
    45  
    46  // 插入
    47  func (this *Array) Insert(index uint, v interface{}) error {
    48  	if this.Len() == uint(cap(this.data)) {
    49  		return errors.New("full array")
    50  	}
    51  	if index != this.length && this.isIndexOutOfRange(index) {
    52  		return errors.New("out of index range")
    53  	}
    54  
    55  	for i := this.length; i > index; i-- {
    56  		this.data[i] = this.data[i-1]
    57  	}
    58  	this.data[index] = v
    59  	this.length++
    60  	return nil
    61  }
    62  
    63  func (this *Array) InsertToTail(v interface{}) error {
    64  	return this.Insert(this.Len(), v)
    65  }
    66  
    67  // 删除索引index上的值
    68  func (this *Array) Delete(index uint) (interface{}, error) {
    69  	if index > this.Len() || this.isIndexOutOfRange(index) {
    70  		return nil, errors.New("out of index range")
    71  	}
    72  	ret := this.data[index]
    73  	for i := index; i < this.Len()-1; i++ {
    74  		this.data[i] = this.data[i+1]
    75  	}
    76  	this.length--
    77  	return ret, nil
    78  }
    79  
    80  func (this *Array) String() string {
    81  	var sb strings.Builder
    82  	sb.WriteRune('[')
    83  	for i := uint(0); i < this.Len(); i++ {
    84  		sb.WriteString(fmt.Sprintf("%v", this.data[i]))
    85  		if i != this.Len()-1 {
    86  			sb.WriteRune(',')
    87  		}
    88  	}
    89  	sb.WriteRune(']')
    90  	return sb.String()
    91  }