feature: added array list
parent
0316759f1a
commit
9212b24d14
|
@ -0,0 +1,8 @@
|
|||
package array_list
|
||||
|
||||
func NewArrayList[T any]() *ArrayList[T] {
|
||||
return &ArrayList[T]{
|
||||
content: make([]T, 0, 10),
|
||||
size: 0,
|
||||
}
|
||||
}
|
|
@ -0,0 +1,129 @@
|
|||
package array_list
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func (self *ArrayList[T]) Add(element T) {
|
||||
if len(self.content) <= self.size {
|
||||
self.content = append(self.content, element)
|
||||
} else {
|
||||
self.content[self.size] = element
|
||||
}
|
||||
|
||||
self.size++
|
||||
}
|
||||
|
||||
func (self *ArrayList[T]) Remove(element T) {
|
||||
indexFromMove := -1
|
||||
for index, value := range self.content {
|
||||
|
||||
if any(value) == any(element) {
|
||||
indexFromMove = index + 1
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
contentSize := len(self.content)
|
||||
|
||||
if indexFromMove >= 0 {
|
||||
|
||||
for i := indexFromMove; i < contentSize; i++ {
|
||||
self.content[i-1] = self.content[i]
|
||||
}
|
||||
|
||||
self.size--
|
||||
}
|
||||
}
|
||||
|
||||
func (self *ArrayList[T]) Get(index int) T {
|
||||
if index < 0 {
|
||||
panic(any(errors.New(fmt.Sprintf("Negative list index %d", index))))
|
||||
}
|
||||
|
||||
if index >= self.size {
|
||||
panic(any(errors.New(fmt.Sprintf("Index %d bigger (or equal?) than list size %d", index, self.size))))
|
||||
}
|
||||
|
||||
return self.content[index]
|
||||
}
|
||||
|
||||
func (self *ArrayList[T]) IndexOf(value T) int {
|
||||
if self.size == 0 {
|
||||
return -1
|
||||
}
|
||||
|
||||
for index, val := range self.content {
|
||||
if any(val) == any(value) {
|
||||
return index
|
||||
}
|
||||
}
|
||||
|
||||
return -1
|
||||
}
|
||||
|
||||
func (self *ArrayList[T]) Contains(value T) bool {
|
||||
return self.IndexOf(value) >= 0
|
||||
}
|
||||
|
||||
func (self *ArrayList[T]) None(test func(T) bool) bool {
|
||||
return !self.Any(test)
|
||||
}
|
||||
|
||||
func (self *ArrayList[T]) AddAll(list *ArrayList[T]) {
|
||||
list.ForEach(func(t T) {
|
||||
self.Add(t)
|
||||
})
|
||||
}
|
||||
|
||||
func (self *ArrayList[T]) Any(test func(T) bool) bool {
|
||||
for index, value := range self.content {
|
||||
if index >= self.size {
|
||||
return false
|
||||
}
|
||||
|
||||
if test(value) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func (self *ArrayList[T]) ForEach(fun func(T)) {
|
||||
for index, value := range self.content {
|
||||
if index >= self.size {
|
||||
return
|
||||
}
|
||||
|
||||
fun(value)
|
||||
}
|
||||
}
|
||||
|
||||
func (self *ArrayList[T]) ForEachBreakable(fun func(T, *bool)) {
|
||||
needsBreak := false
|
||||
for index, value := range self.content {
|
||||
if index >= self.size {
|
||||
return
|
||||
}
|
||||
|
||||
if needsBreak {
|
||||
break
|
||||
}
|
||||
|
||||
fun(value, &needsBreak)
|
||||
}
|
||||
}
|
||||
|
||||
func (self *ArrayList[T]) Size() int {
|
||||
return self.size
|
||||
}
|
||||
|
||||
func (self *ArrayList[T]) IsEmpty() bool {
|
||||
return self.Size() <= 0
|
||||
}
|
||||
|
||||
func (self *ArrayList[T]) String() string {
|
||||
return fmt.Sprintf("%v", self.content)
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
package array_list
|
||||
|
||||
type ArrayList[T any] struct {
|
||||
content []T
|
||||
size int
|
||||
}
|
Loading…
Reference in New Issue