mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-13 01:02:28 +08:00
feat: add func Contain, Union, Intersection
This commit is contained in:
@@ -44,6 +44,17 @@ func (l *List[T]) IndexOf(value T) int {
|
|||||||
return index
|
return index
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Contain checks if the value in the list or not
|
||||||
|
func (l *List[T]) Contain(value T) bool {
|
||||||
|
data := l.data
|
||||||
|
for _, v := range data {
|
||||||
|
if reflect.DeepEqual(v, value) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// Push append value to the list data
|
// Push append value to the list data
|
||||||
func (l *List[T]) Push(value T) {
|
func (l *List[T]) Push(value T) {
|
||||||
l.data = append(l.data, value)
|
l.data = append(l.data, value)
|
||||||
@@ -141,14 +152,14 @@ func (l *List[T]) IsEmpty() bool {
|
|||||||
return len(l.data) == 0
|
return len(l.data) == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clone return a copy of list
|
// Clear the data of list
|
||||||
func (l *List[T]) Clear() {
|
func (l *List[T]) Clear() {
|
||||||
l.data = make([]T, 0)
|
l.data = make([]T, 0, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clone return a copy of list
|
// Clone return a copy of list
|
||||||
func (l *List[T]) Clone() *List[T] {
|
func (l *List[T]) Clone() *List[T] {
|
||||||
cl := &List[T]{data: make([]T, len(l.data))}
|
cl := NewList(make([]T, len(l.data)))
|
||||||
copy(cl.data, l.data)
|
copy(cl.data, l.data)
|
||||||
|
|
||||||
return cl
|
return cl
|
||||||
@@ -157,7 +168,8 @@ func (l *List[T]) Clone() *List[T] {
|
|||||||
// Merge two list, return new list, don't change original list
|
// Merge two list, return new list, don't change original list
|
||||||
func (l *List[T]) Merge(other *List[T]) *List[T] {
|
func (l *List[T]) Merge(other *List[T]) *List[T] {
|
||||||
l1, l2 := len(l.data), len(other.data)
|
l1, l2 := len(l.data), len(other.data)
|
||||||
ml := &List[T]{data: make([]T, l1+l2, l1+l2)}
|
ml := NewList(make([]T, l1+l2, l1+l2))
|
||||||
|
|
||||||
data := append([]T{}, append(l.data, other.data...)...)
|
data := append([]T{}, append(l.data, other.data...)...)
|
||||||
ml.data = data
|
ml.data = data
|
||||||
|
|
||||||
@@ -207,3 +219,27 @@ func (l *List[T]) Unique() {
|
|||||||
|
|
||||||
l.data = uniqueData
|
l.data = uniqueData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Union creates a new list contain all element in list l and other, remove duplicate element.
|
||||||
|
func (l *List[T]) Union(other *List[T]) *List[T] {
|
||||||
|
res := NewList([]T{})
|
||||||
|
|
||||||
|
res.data = append(res.data, l.data...)
|
||||||
|
res.data = append(res.data, other.data...)
|
||||||
|
res.Unique()
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// Intersection creates a new list whose element both be contained in list l and other
|
||||||
|
func (l *List[T]) Intersection(other *List[T]) *List[T] {
|
||||||
|
res := NewList(make([]T, 0, 0))
|
||||||
|
|
||||||
|
for _, v := range l.data {
|
||||||
|
if other.Contain(v) {
|
||||||
|
res.data = append(res.data, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|||||||
@@ -36,6 +36,14 @@ func TestIndexOf(t *testing.T) {
|
|||||||
assert.Equal(-1, i)
|
assert.Equal(-1, i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestContain(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestContain")
|
||||||
|
|
||||||
|
list := NewList([]int{1, 2, 3})
|
||||||
|
assert.Equal(true, list.Contain(1))
|
||||||
|
assert.Equal(false, list.Contain(0))
|
||||||
|
}
|
||||||
|
|
||||||
func TestPush(t *testing.T) {
|
func TestPush(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestPush")
|
assert := internal.NewAssert(t, "TestPush")
|
||||||
|
|
||||||
@@ -240,3 +248,25 @@ func TestUnique(t *testing.T) {
|
|||||||
|
|
||||||
assert.Equal(true, expected.EqutalTo(list))
|
assert.Equal(true, expected.EqutalTo(list))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUnion(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestUnion")
|
||||||
|
|
||||||
|
list1 := NewList([]int{1, 2, 3, 4})
|
||||||
|
list2 := NewList([]int{4, 5, 6})
|
||||||
|
expected := NewList([]int{1, 2, 3, 4, 5, 6})
|
||||||
|
|
||||||
|
list3 := list1.Union(list2)
|
||||||
|
assert.Equal(true, expected.EqutalTo(list3))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIntersection(t *testing.T) {
|
||||||
|
assert := internal.NewAssert(t, "TestIntersection")
|
||||||
|
|
||||||
|
list1 := NewList([]int{1, 2, 3, 4})
|
||||||
|
list2 := NewList([]int{4, 5, 6})
|
||||||
|
expected := NewList([]int{4})
|
||||||
|
|
||||||
|
list3 := list1.Intersection(list2)
|
||||||
|
assert.Equal(true, expected.EqutalTo(list3))
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user