From 1fe4cdc429664de10904ab3b8b2fcf64e38a6664 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Mon, 6 Feb 2023 10:55:42 +0800 Subject: [PATCH] feat: add Difference and SymmetricDifference for list --- datastructure/list/list.go | 40 ++++++++++++++++++++++++++++++++- datastructure/list/list_test.go | 22 ++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/datastructure/list/list.go b/datastructure/list/list.go index ef77b0f..cea36e0 100644 --- a/datastructure/list/list.go +++ b/datastructure/list/list.go @@ -5,8 +5,9 @@ package datastructure import ( - "github.com/duke-git/lancet/v2/iterator" "reflect" + + "github.com/duke-git/lancet/v2/iterator" ) // List is a linear table, implemented with slice. @@ -317,6 +318,43 @@ func (l *List[T]) Intersection(other *List[T]) *List[T] { return result } +// Difference returns the difference between two collections. +// return a list whose element in the original list, not in the given list. +func (l *List[T]) Difference(other *List[T]) *List[T] { + result := NewList(make([]T, 0)) + + intersectList := l.Intersection(other) + + for _, v := range l.data { + if !intersectList.Contain(v) { + result.data = append(result.data, v) + } + } + + return result +} + +// SymmetricDifference oppoiste operation of intersection function. +func (l *List[T]) SymmetricDifference(other *List[T]) *List[T] { + result := NewList(make([]T, 0)) + + intersectList := l.Intersection(other) + + for _, v := range l.data { + if !intersectList.Contain(v) { + result.data = append(result.data, v) + } + } + + for _, v := range other.data { + if !intersectList.Contain(v) { + result.data = append(result.data, v) + } + } + + return result +} + // SubList returns a sub list of the original list between the specified fromIndex, inclusive, and toIndex, exclusive. func (l *List[T]) SubList(fromIndex, toIndex int) *List[T] { data := l.data[fromIndex:toIndex] diff --git a/datastructure/list/list_test.go b/datastructure/list/list_test.go index 0ce58ba..67a4319 100644 --- a/datastructure/list/list_test.go +++ b/datastructure/list/list_test.go @@ -328,6 +328,28 @@ func TestIntersection(t *testing.T) { assert.Equal(true, expected.Equal(list3)) } +func TestDifference(t *testing.T) { + assert := internal.NewAssert(t, "TestDifference") + + list1 := NewList([]int{1, 2, 3}) + list2 := NewList([]int{1, 2, 4}) + expected := NewList([]int{3}) + + list3 := list1.Difference(list2) + assert.Equal(true, expected.Equal(list3)) +} + +func TestSymmetricDifference(t *testing.T) { + assert := internal.NewAssert(t, "TestSymmetricDifference") + + list1 := NewList([]int{1, 2, 3}) + list2 := NewList([]int{1, 2, 4}) + expected := NewList([]int{3, 4}) + + list3 := list1.SymmetricDifference(list2) + assert.Equal(true, expected.Equal(list3)) +} + func TestSubSlice(t *testing.T) { assert := internal.NewAssert(t, "TestSubSlice")