diff --git a/datastructure/set/set.go b/datastructure/set/set.go index 36bf254..53ab1d9 100644 --- a/datastructure/set/set.go +++ b/datastructure/set/set.go @@ -104,6 +104,24 @@ func (s Set[T]) Intersection(other Set[T]) Set[T] { return set } +// SymmetricDifference creates a new set whose element both be contained in set s and other +func (s Set[T]) SymmetricDifference(other Set[T]) Set[T] { + set := NewSet[T]() + s.Iterate(func(value T) { + if !other.Contain(value) { + set.Add(value) + } + }) + + other.Iterate(func(value T) { + if !s.Contain(value) { + set.Add(value) + } + }) + + return set +} + // Minus creates an set of whose element in origin set but not in compared set func (s Set[T]) Minus(comparedSet Set[T]) Set[T] { set := NewSet[T]() diff --git a/datastructure/set/set_test.go b/datastructure/set/set_test.go index 3325f75..be11e68 100644 --- a/datastructure/set/set_test.go +++ b/datastructure/set/set_test.go @@ -128,6 +128,15 @@ func TestSet_Intersection(t *testing.T) { assert.Equal(expected, intersectionSet) } +func TestSet_SymmetricDifference(t *testing.T) { + assert := internal.NewAssert(t, "TestSet_SymmetricDifference") + + set1 := NewSet(1, 2, 3) + set2 := NewSet(2, 3, 4, 5) + + assert.Equal(NewSet(1, 4, 5), set1.SymmetricDifference(set2)) +} + func TestSet_Minus(t *testing.T) { assert := internal.NewAssert(t, "TestSet_Minus")