diff --git a/datastructure/list/list.go b/datastructure/list/list.go index f610436..97556df 100644 --- a/datastructure/list/list.go +++ b/datastructure/list/list.go @@ -406,7 +406,7 @@ func (l *List[T]) Iterator() iterator.Iterator[T] { return iterator.FromSlice(l.data) } -// ToMap convert a list to a map based on iteratee function. +// ListToMap convert a list to a map based on iteratee function. func ListToMap[T any, K comparable, V any](list *List[T], iteratee func(T) (K, V)) map[K]V { result := make(map[K]V, list.Size()) for _, item := range list.data { diff --git a/docs/datastructure/list.md b/docs/datastructure/list.md index 98d6760..0385e2b 100644 --- a/docs/datastructure/list.md +++ b/docs/datastructure/list.md @@ -47,6 +47,13 @@ import ( - [Unique](#Unique) - [Union](#Union) - [Intersection](#Intersection) +- [Difference](#Difference) +- [SymmetricDifference](#SymmetricDifference) +- [RetainAll](#RetainAll) +- [DeleteAll](#DeleteAll) +- [ForEach](#ForEach) +- [Iterator](#Iterator) +- [ListToMap](#ListToMap) - [SubList](#SubList) - [DeleteIf](#DeleteIf) @@ -828,6 +835,233 @@ func main() { +### Difference +

Return a list whose element in the original list, not in the given list.

+ +Signature: + +```go +func (l *List[T]) Difference(other *List[T]) *List[T] +``` +Example: + +```go +package main + +import ( + "fmt" + list "github.com/duke-git/lancet/v2/datastructure/list" +) + +func main() { + list1 := NewList([]int{1, 2, 3}) + list2 := NewList([]int{1, 2, 4}) + + list3 := list1.Intersection(list2) + + fmt.Println(list3.Data()) //3 +} +``` + + +### SymmetricDifference +

Oppoiste operation of intersection function.

+ +Signature: + +```go +func (l *List[T]) SymmetricDifference(other *List[T]) *List[T] +``` +Example: + +```go +package main + +import ( + "fmt" + list "github.com/duke-git/lancet/v2/datastructure/list" +) + +func main() { + list1 := NewList([]int{1, 2, 3}) + list2 := NewList([]int{1, 2, 4}) + + list3 := list1.Intersection(list2) + + fmt.Println(list3.Data()) //3, 4 +} +``` + + +### RetainAll +

Retains only the elements in this list that are contained in the given list.

+ +Signature: + +```go +func (l *List[T]) RetainAll(list *List[T]) bool +``` +Example: + +```go +package main + +import ( + "fmt" + list "github.com/duke-git/lancet/v2/datastructure/list" +) + +func main() { + list := NewList([]int{1, 2, 3, 4}) + list1 := NewList([]int{1, 2, 3, 4}) + list2 := NewList([]int{1, 2, 3, 4}) + + retain := NewList([]int{1, 2}) + retain1 := NewList([]int{2, 3}) + retain2 := NewList([]int{1, 2, 5}) + + list.RetainAll(retain) + list1.RetainAll(retain1) + list2.RetainAll(retain2) + + fmt.Println(list.Data()) //1, 2 + fmt.Println(list1.Data()) //2, 3 + fmt.Println(list2.Data()) //1, 2 +} +``` + + +### DeleteAll +

Removes from this list all of its elements that are contained in the given list.

+ +Signature: + +```go +func (l *List[T]) DeleteAll(list *List[T]) bool +``` +Example: + +```go +package main + +import ( + "fmt" + list "github.com/duke-git/lancet/v2/datastructure/list" +) + +func main() { + list := NewList([]int{1, 2, 3, 4}) + list1 := NewList([]int{1, 2, 3, 4}) + list2 := NewList([]int{1, 2, 3, 4}) + + del := NewList([]int{1}) + del1 := NewList([]int{2, 3}) + del2 := NewList([]int{1, 2, 5}) + + list.DeleteAll(del) + list1.DeleteAll(del1) + list2.DeleteAll(del2) + + fmt.Println(list.Data()) //2,3,4 + fmt.Println(list1.Data()) //1,4 + fmt.Println(list2.Data()) //3,4 +} +``` + + +### ForEach +

Performs the given action for each element of the list.

+ +Signature: + +```go +func (l *List[T]) ForEach(consumer func(T)) +``` +Example: + +```go +package main + +import ( + "fmt" + list "github.com/duke-git/lancet/v2/datastructure/list" +) + +func main() { + list := NewList([]int{1, 2, 3, 4}) + + result := make([]int, 0) + list.ForEach(func(i int) { + result = append(result, i) + }) + + fmt.Println(result.Data()) //1,2,3,4 +} +``` + + +### Iterator +

Returns an iterator over the elements in this list in proper sequence.

+ +Signature: + +```go +func (l *List[T]) Iterator() iterator.Iterator[T] +``` +Example: + +```go +package main + +import ( + "fmt" + list "github.com/duke-git/lancet/v2/datastructure/list" +) + +func main() { + list := NewList([]int{1, 2, 3, 4}) + + iterator := list.Iterator() + + result := make([]int, 0) + for iterator.HasNext() { + item, _ := iterator.Next() + result = append(result, item) + } + + fmt.Println(result.Data()) //1,2,3,4 +} +``` + + +### ListToMap +

Converts a list to a map based on iteratee function.

+ +Signature: + +```go +func ListToMap[T any, K comparable, V any](list *List[T], iteratee func(T) (K, V)) map[K]V +``` +Example: + +```go +package main + +import ( + "fmt" + list "github.com/duke-git/lancet/v2/datastructure/list" +) + +func main() { + list := NewList([]int{1, 2, 3, 4}) + + result := ListToMap(list, func(n int) (int, bool) { + return n, n > 1 + }) + + fmt.Println(result) //map[int]bool{1: false, 2: true, 3: true, 4: true} +} +``` ### SubList

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

diff --git a/docs/datastructure/list_zh-CN.md b/docs/datastructure/list_zh-CN.md index 6e560e4..b777019 100644 --- a/docs/datastructure/list_zh-CN.md +++ b/docs/datastructure/list_zh-CN.md @@ -34,7 +34,6 @@ import ( - [PopLast](#PopLast) - [DeleteAt](#DeleteAt) - [InsertAt](#InsertAt) - - [UpdateAt](#UpdateAt) - [Equal](#Equal) - [IsEmpty](#IsEmpty) @@ -48,6 +47,13 @@ import ( - [Unique](#Unique) - [Union](#Union) - [Intersection](#Intersection) +- [Difference](#Difference) +- [SymmetricDifference](#SymmetricDifference) +- [RetainAll](#RetainAll) +- [DeleteAll](#DeleteAll) +- [ForEach](#ForEach) +- [Iterator](#Iterator) +- [ListToMap](#ListToMap) - [SubList](#SubList) - [DeleteIf](#DeleteIf) @@ -66,7 +72,7 @@ type List[T any] struct { } func NewList[T any](data []T) *List[T] ``` -例子: +示例: ```go package main @@ -92,7 +98,7 @@ func main() { ```go func (l *List[T]) Contain(value T) bool ``` -例子: +示例: ```go package main @@ -121,7 +127,7 @@ func main() { ```go func (l *List[T]) Data() []T ``` -例子: +示例: ```go package main @@ -150,7 +156,7 @@ func main() { ```go func (l *List[T]) ValueOf(index int) (*T, bool) ``` -例子: +示例: ```go package main @@ -180,7 +186,7 @@ func main() { ```go func (l *List[T]) IndexOf(value T) int ``` -例子: +示例: ```go package main @@ -207,7 +213,7 @@ func main() { ```go func (l *List[T]) LastIndexOf(value T) int ``` -例子: +示例: ```go package main @@ -233,7 +239,7 @@ func main() { ```go func (l *List[T]) IndexOfFunc(f func(T) bool) int ``` -例子: +示例: ```go package main @@ -259,7 +265,7 @@ func main() { ```go func (l *List[T]) LastIndexOfFunc(f func(T) bool) int ``` -例子: +示例: ```go package main @@ -287,7 +293,7 @@ func main() { ```go func (l *List[T]) Push(value T) ``` -例子: +示例: ```go package main @@ -316,7 +322,7 @@ func main() { ```go func (l *List[T]) PopFirst() (*T, bool) ``` -例子: +示例: ```go package main @@ -348,7 +354,7 @@ func main() { ```go func (l *List[T]) PopLast() (*T, bool) ``` -例子: +示例: ```go package main @@ -379,7 +385,7 @@ func main() { ```go func (l *List[T]) DeleteAt(index int) ``` -例子: +示例: ```go package main @@ -417,7 +423,7 @@ func main() { ```go func (l *List[T]) InsertAt(index int, value T) ``` -例子: +示例: ```go package main @@ -454,7 +460,7 @@ func main() { ```go func (l *List[T]) UpdateAt(index int, value T) ``` -例子: +示例: ```go package main @@ -487,7 +493,7 @@ func main() { ```go func (l *List[T]) Equal(other *List[T]) bool ``` -例子: +示例: ```go package main @@ -517,7 +523,7 @@ func main() { ```go func (l *List[T]) IsEmpty() bool ``` -例子: +示例: ```go package main @@ -547,7 +553,7 @@ func main() { ```go func (l *List[T]) Clear() ``` -例子: +示例: ```go package main @@ -575,7 +581,7 @@ func main() { ```go func (l *List[T]) Clone() *List[T] ``` -例子: +示例: ```go package main @@ -604,7 +610,7 @@ func main() { ```go func (l *List[T]) Merge(other *List[T]) *List[T] ``` -例子: +示例: ```go package main @@ -633,7 +639,7 @@ func main() { ```go func (l *List[T]) Size() int ``` -例子: +示例: ```go package main @@ -660,7 +666,7 @@ func main() { ```go func (l *List[T]) Cap() int ``` -例子: +示例: ```go package main @@ -689,7 +695,7 @@ func main() { ```go func (l *List[T]) Swap(i, j int) ``` -例子: +示例: ```go package main @@ -718,7 +724,7 @@ func main() { ```go func (l *List[T]) Reverse() ``` -例子: +示例: ```go package main @@ -747,7 +753,7 @@ func main() { ```go func (l *List[T]) Unique() ``` -例子: +示例: ```go package main @@ -776,7 +782,7 @@ func main() { ```go func (l *List[T]) Union(other *List[T]) *List[T] ``` -例子: +示例: ```go package main @@ -806,7 +812,7 @@ func main() { ```go func (l *List[T]) Intersection(other *List[T]) *List[T] ``` -例子: +示例: ```go package main @@ -826,16 +832,244 @@ func main() { ``` +### Difference +

差集运算。

+ +函数签名: + +```go +func (l *List[T]) Difference(other *List[T]) *List[T] +``` +示例: + +```go +package main + +import ( + "fmt" + list "github.com/duke-git/lancet/v2/datastructure/list" +) + +func main() { + list1 := NewList([]int{1, 2, 3}) + list2 := NewList([]int{1, 2, 4}) + + list3 := list1.Intersection(list2) + + fmt.Println(list3.Data()) //3 +} +``` + + +### SymmetricDifference +

对称差集运算。

+ +函数签名: + +```go +func (l *List[T]) SymmetricDifference(other *List[T]) *List[T] +``` +示例: + +```go +package main + +import ( + "fmt" + list "github.com/duke-git/lancet/v2/datastructure/list" +) + +func main() { + list1 := NewList([]int{1, 2, 3}) + list2 := NewList([]int{1, 2, 4}) + + list3 := list1.Intersection(list2) + + fmt.Println(list3.Data()) //3, 4 +} +``` + + +### RetainAll +

仅保留列表中包含在给定列表中的元素。

+ +函数签名: + +```go +func (l *List[T]) RetainAll(list *List[T]) bool +``` +示例: + +```go +package main + +import ( + "fmt" + list "github.com/duke-git/lancet/v2/datastructure/list" +) + +func main() { + list := NewList([]int{1, 2, 3, 4}) + list1 := NewList([]int{1, 2, 3, 4}) + list2 := NewList([]int{1, 2, 3, 4}) + + retain := NewList([]int{1, 2}) + retain1 := NewList([]int{2, 3}) + retain2 := NewList([]int{1, 2, 5}) + + list.RetainAll(retain) + list1.RetainAll(retain1) + list2.RetainAll(retain2) + + fmt.Println(list.Data()) //1, 2 + fmt.Println(list1.Data()) //2, 3 + fmt.Println(list2.Data()) //1, 2 +} +``` + + +### DeleteAll +

从列表中删除给定列表中包含的所有元素。

+ +函数签名: + +```go +func (l *List[T]) DeleteAll(list *List[T]) bool +``` +示例: + +```go +package main + +import ( + "fmt" + list "github.com/duke-git/lancet/v2/datastructure/list" +) + +func main() { + list := NewList([]int{1, 2, 3, 4}) + list1 := NewList([]int{1, 2, 3, 4}) + list2 := NewList([]int{1, 2, 3, 4}) + + del := NewList([]int{1}) + del1 := NewList([]int{2, 3}) + del2 := NewList([]int{1, 2, 5}) + + list.DeleteAll(del) + list1.DeleteAll(del1) + list2.DeleteAll(del2) + + fmt.Println(list.Data()) //2,3,4 + fmt.Println(list1.Data()) //1,4 + fmt.Println(list2.Data()) //3,4 +} +``` + + +### ForEach +

对列表的每个元素执行给定的操作。

+ +函数签名: + +```go +func (l *List[T]) ForEach(consumer func(T)) +``` +示例: + +```go +package main + +import ( + "fmt" + list "github.com/duke-git/lancet/v2/datastructure/list" +) + +func main() { + list := NewList([]int{1, 2, 3, 4}) + + result := make([]int, 0) + list.ForEach(func(i int) { + result = append(result, i) + }) + + fmt.Println(result.Data()) //1,2,3,4 +} +``` + + +### Iterator +

按顺序返回列表中元素的迭代器。

+ +函数签名: + +```go +func (l *List[T]) Iterator() iterator.Iterator[T] +``` +示例: + +```go +package main + +import ( + "fmt" + list "github.com/duke-git/lancet/v2/datastructure/list" +) + +func main() { + list := NewList([]int{1, 2, 3, 4}) + + iterator := list.Iterator() + + result := make([]int, 0) + for iterator.HasNext() { + item, _ := iterator.Next() + result = append(result, item) + } + + fmt.Println(result.Data()) //1,2,3,4 +} +``` + + +### ListToMap +

基于iteratee函数将列表转换为映射map。

+ +函数签名: + +```go +func ListToMap[T any, K comparable, V any](list *List[T], iteratee func(T) (K, V)) map[K]V +``` +示例: + +```go +package main + +import ( + "fmt" + list "github.com/duke-git/lancet/v2/datastructure/list" +) + +func main() { + list := NewList([]int{1, 2, 3, 4}) + + result := ListToMap(list, func(n int) (int, bool) { + return n, n > 1 + }) + + fmt.Println(result) //map[int]bool{1: false, 2: true, 3: true, 4: true} +} +``` + ### SubList -

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

+

返回指定的fromIndex(包含)和toIndex(不包含)之间的原始列表的子列表。

函数签名: ```go func (l *List[T]) SubList(fromIndex, toIndex int) *List[T] ``` -例子: +示例: ```go package main @@ -863,7 +1097,7 @@ func main() { ```go func (l *List[T]) DeleteIf(f func(T) bool) int ``` -例子: +示例: ```go package main