1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-04 12:52:28 +08:00
Files
lancet/docs/datastructure/list.md
donutloop c1b7500bcb List: add cap (#51)
Cap return cap of the inner data
2022-07-25 20:50:31 +08:00

14 KiB

List

List is a linear table, implemented with slice.

Source

Usage

import (
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

Index

Documentation

NewList

List is a linear table, implemented with slice. NewList function return a list pointer

Signature:

type List[T any] struct {
	data []T
}
func NewList[T any](data []T) *List[T]

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3})
    fmt.Println(li)
}

Contain

Check if the value in the list or not

Signature:

func (l *List[T]) Contain(value T) bool

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3})

    fmt.Println(li.Contain(1)) //true
    fmt.Println(li.Contain(0)) //false
}

Data

Return slice of list data

Signature:

func (l *List[T]) Data() []T

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3})
    data := li.Data()

    fmt.Println(data) //[]int{1, 2, 3}
}

ValueOf

Return the value pointer at index in list

Signature:

func (l *List[T]) ValueOf(index int) (*T, bool)

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3})
    v, ok := li.ValueOf(0)

    fmt.Println(*v) //1
    fmt.Println(ok) //true
}

IndexOf

Returns the index of value in the list. if not found return -1

Signature:

func (l *List[T]) IndexOf(value T) int

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3})

    fmt.Println(li.IndexOf(1)) //0
    fmt.Println(li.IndexOf(0)) //-1
}

LastIndexOf

Returns the index of the last occurrence of the value in this list if not found return -1

Signature:

func (l *List[T]) LastIndexOf(value T) int

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3, 1})

    fmt.Println(li.LastIndexOf(1)) // 3
    fmt.Println(li.LastIndexOf(0)) //-1
}

IndexOfFunc

IndexOfFunc returns the first index satisfying f(v). if not found return -1

Signature:

func (l *List[T]) IndexOfFunc(f func(T) bool) int 

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3})

    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 1 })) //0
    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 0 })) //-1
}

LastIndexOfFunc

LastIndexOfFunc returns the index of the last occurrence of the value in this list satisfying f(data[i]). if not found return -1

Signature:

func (l *List[T]) LastIndexOfFunc(f func(T) bool) int

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3, 1})

    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 1 })) // 3
    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 0 })) //-1
}

Push

Append value to the list

Signature:

func (l *List[T]) Push(value T)

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3})
    li.Push(4)

    fmt.Println(li.Data()) //[]int{1, 2, 3, 4}
}

PopFirst

Delete the first value of list and return it

Signature:

func (l *List[T]) PopFirst() (*T, bool)

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3})
    v, ok := li.PopFirst()

    fmt.Println(*v) //1
    fmt.Println(ok) //true
    fmt.Println(li.Data()) //2, 3
}

PopFirst

Delete the last value of list and return it

Signature:

func (l *List[T]) PopLast() (*T, bool)

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3})
    v, ok := li.PopLast()

    fmt.Println(*v) //3
    fmt.Println(ok) //true
    fmt.Println(li.Data()) //1, 2
}

DeleteAt

Delete the value of list at index, if index is not between 0 and length of list data, do nothing

Signature:

func (l *List[T]) DeleteAt(index int)

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3, 4})

    li.DeleteAt(-1)
    fmt.Println(li.Data()) //1,2,3,4

    li.DeleteAt(4)
    fmt.Println(li.Data()) //1,2,3,4

    li.DeleteAt(0)
    fmt.Println(li.Data()) //2,3,4

    li.DeleteAt(2)
    fmt.Println(li.Data()) //2,3
}

InsertAt

Insert value into list at index, if index is not between 0 and length of list data, do nothing

Signature:

func (l *List[T]) InsertAt(index int, value T)

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3})

    li.InsertAt(-1, 0)
    fmt.Println(li.Data()) //1,2,3

    li.InsertAt(4, 0)
    fmt.Println(li.Data()) //1,2,3

    li.InsertAt(3, 4)
    fmt.Println(li.Data()) //1,2,3,4

    // li.InsertAt(2, 4)
    // fmt.Println(li.Data()) //1,2,4,3
}

UpdateAt

Update value of list at index, index shoud between 0 and list size - 1

Signature:

func (l *List[T]) UpdateAt(index int, value T)

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3})

    li.UpdateAt(-1, 0)
    fmt.Println(li.Data()) //1,2,3

    li.UpdateAt(2, 4)
    fmt.Println(li.Data()) //1,2,4

    li.UpdateAt(3, 5)
    fmt.Println(li.Data()) //1,2,4
}

Equal

Compare a list to another list, use reflect.DeepEqual on every element

Signature:

func (l *List[T]) Equal(other *List[T]) bool

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li1 := list.NewList([]int{1, 2, 3, 4})
    li2 := list.NewList([]int{1, 2, 3, 4})
    li3 := list.NewList([]int{1, 2, 3})

    fmt.Println(li1.Equal(li2)) //true
    fmt.Println(li1.Equal(li3)) //false
}

IsEmpty

Check if a list is empty or not

Signature:

func (l *List[T]) IsEmpty() bool

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li1 := list.NewList([]int{1, 2, 3})
    li2 := list.NewList([]int{})

    fmt.Println(li1.IsEmpty()) //false
    fmt.Println(li2.IsEmpty()) //true
}

Clear

Clear the data of list

Signature:

func (l *List[T]) Clear()

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3})
    li.Clear()

    fmt.Println(li.Data()) // empty
}

Clone

Return a copy of list

Signature:

func (l *List[T]) Clone() *List[T]

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3})
    cloneList := li.Clone()

    fmt.Println(cloneList.Data()) // 1,2,3
}

Merge

Merge two list, return new list, don't change original list

Signature:

func (l *List[T]) Merge(other *List[T]) *List[T]

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li1 := list.NewList([]int{1, 2, 3, 4})
    li2 := list.NewList([]int{4, 5, 6})
    li3 := li1.Merge(li2)

    fmt.Println(li3.Data()) //1, 2, 3, 4, 4, 5, 6
}

Size

Return number of list data items

Signature:

func (l *List[T]) Size() int

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3, 4})

    fmt.Println(li.Size()) //4
}

Cap

Cap return cap of the inner data

Signature:

func (l *List[T]) Cap() int

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
	data := make([]int, 0, 100)
	
    li := list.NewList(data)

    fmt.Println(li.Cap()) // 100
}

Swap

Swap the value at two index in list

Signature:

func (l *List[T]) Swap(i, j int)

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3, 4})
    li.Swap(0, 3)

    fmt.Println(li.Data()) //4, 2, 3, 1
}

Reverse

Reverse the data item order of list

Signature:

func (l *List[T]) Reverse()

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 3, 4})
    li.Reverse()

    fmt.Println(li.Data()) //4, 3, 2, 1
}

Unique

Remove duplicate items in list

Signature:

func (l *List[T]) Unique()

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li := list.NewList([]int{1, 2, 2, 3, 4})
    li.Unique()

    fmt.Println(li.Data()) //1,2,3,4
}

Union

Creates a new list contain all elements in list l and other, remove duplicate element

Signature:

func (l *List[T]) Union(other *List[T]) *List[T]

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li1 := list.NewList([]int{1, 2, 3, 4})
    li2 := list.NewList([]int{4, 5, 6})
    li3 := li1.Union(li2)

    fmt.Println(li3.Data()) //1,2,3,4,5,6
}

Intersection

Creates a new list whose element both be contained in list l and other

Signature:

func (l *List[T]) Intersection(other *List[T]) *List[T]

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    li1 := list.NewList([]int{1, 2, 3, 4})
    li2 := list.NewList([]int{4, 5, 6})
    li3 := li1.Intersection(li2)

    fmt.Println(li3.Data()) //4
}

SubList

SubList returns a sub list of the original list between the specified fromIndex, inclusive, and toIndex, exclusive.

Signature:

func (l *List[T]) SubList(fromIndex, toIndex int) *List[T] 

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
    l := list.NewList([]int{1, 2, 3, 4, 5, 6})
   
    fmt.Println(l.SubList(2, 5)) // []int{3, 4, 5}
}

DeleteIf

DeleteIf delete all satisfying f(data[i]), returns count of removed elements

Signature:

func (l *List[T]) DeleteIf(f func(T) bool) int

Example:

package main

import (
    "fmt"
    list "github.com/duke-git/lancet/v2/datastructure/list"
)

func main() {
	l := list.NewList([]int{1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1})

	fmt.Println(l.DeleteIf(func(a int) bool { return a == 1 })) // 12 
	fmt.Println(l.Data()) // []int{2, 3, 4}
}