Skip to content

Commit e3903aa

Browse files
authored
Adiciona método Contains e marca InArray como deprecado (#10)
1 parent 6df4480 commit e3903aa

5 files changed

Lines changed: 118 additions & 11 deletions

File tree

linkedhashmap.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,21 +61,21 @@ func (l *linkedHashMap) Put(key, value interface{}) {
6161
}
6262

6363
// Get gets an entry from the linked hash map
64-
func (l *linkedHashMap) Get(key interface{}) interface{} {
64+
func (l *linkedHashMap) Get(key interface{}) (value interface{}, found bool) {
6565
hash := l.hash(key)
6666
if _, ok := l.table[hash]; !ok {
67-
return nil
67+
return nil, false
6868
}
6969

7070
tmp := l.table[hash]
7171
for tmp != nil {
7272
if tmp.key == key {
73-
return tmp.value
73+
return tmp.value, true
7474
}
7575
tmp = tmp.after
7676
}
7777

78-
return nil
78+
return nil, false
7979
}
8080

8181
// Remove removes an entry from the linked hash map

linkedhashmap_test.go

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,17 @@ func TestGet(t *testing.T) {
1212
set := newLinkedHashMap()
1313
value := rand.Int()
1414
set.Put("test", value)
15-
require.Equal(t, value, set.Get("test"))
15+
16+
v, exists := set.Get("test")
17+
require.Equal(t, value, v)
18+
require.True(t, exists)
1619
})
1720

1821
t.Run("When the key not exists", func(t *testing.T) {
1922
set := newLinkedHashMap()
20-
result := set.Get("bla")
23+
result, exists := set.Get("bla")
2124
require.Nil(t, result)
25+
require.False(t, exists)
2226
})
2327
}
2428

@@ -27,7 +31,10 @@ func TestPut(t *testing.T) {
2731
set := newLinkedHashMap()
2832
value := rand.Int()
2933
set.Put("test", value)
30-
require.Equal(t, value, set.Get("test"))
34+
35+
v, exists := set.Get("test")
36+
require.Equal(t, value, v)
37+
require.True(t, exists)
3138
})
3239

3340
t.Run("invalid key", func(t *testing.T) {
@@ -50,7 +57,10 @@ func TestRemove(t *testing.T) {
5057

5158
set.Remove(1)
5259
require.Equal(t, 2, set.Length())
53-
require.Nil(t, set.Get(1))
60+
61+
v, exists := set.Get(1)
62+
require.Nil(t, v)
63+
require.False(t, exists)
5464
})
5565

5666
t.Run("last value", func(t *testing.T) {
@@ -61,7 +71,10 @@ func TestRemove(t *testing.T) {
6171

6272
set.Remove(3)
6373
require.Equal(t, 2, set.Length())
64-
require.Nil(t, set.Get(3))
74+
75+
v, exists := set.Get(3)
76+
require.Nil(t, v)
77+
require.False(t, exists)
6578
})
6679

6780
t.Run("middle value", func(t *testing.T) {
@@ -72,14 +85,20 @@ func TestRemove(t *testing.T) {
7285

7386
set.Remove(2)
7487
require.Equal(t, 2, set.Length())
75-
require.Nil(t, set.Get(2))
88+
89+
v, exists := set.Get(2)
90+
require.Nil(t, v)
91+
require.False(t, exists)
7692
})
7793

7894
t.Run("single value", func(t *testing.T) {
7995
set := newLinkedHashMap()
8096
set.Put(1, 1)
8197
set.Remove(1)
8298
require.Equal(t, 0, set.Length())
83-
require.Nil(t, set.Get(1))
99+
100+
v, exists := set.Get(1)
101+
require.Nil(t, v)
102+
require.False(t, exists)
84103
})
85104
}

linkedhashset.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ func (l *LinkedHashSet[T]) AsInterface() []interface{} {
6161
}
6262

6363
// InArray returns whether the given item is in array or not
64+
// DEPRECATED: use Contains method instead
6465
func (l *LinkedHashSet[T]) InArray(search T) bool {
6566
for item := range l.Iter() {
6667
if item == search {
@@ -80,3 +81,8 @@ func NewLinkedHashSet[T comparable](items ...T) *LinkedHashSet[T] {
8081
}
8182
return lhm
8283
}
84+
85+
func (l *LinkedHashSet[T]) Contains(search T) bool {
86+
_, contains := l.linkedHashMap.Get(search)
87+
return contains
88+
}

linkedhashset_benchmark_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package set
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
func BenchmarkLinkedHashSet_Contains_vs_InArray(b *testing.B) {
9+
total := len(giantGenericSlice)
10+
step := total / 5
11+
sizes := []int{step, 2 * step, 3 * step, 4 * step, total}
12+
13+
for _, n := range sizes {
14+
b.Run(fmt.Sprintf("N=%d", n), func(b *testing.B) {
15+
set := NewLinkedHashSet[string]()
16+
set.Add(giantGenericSlice[:n]...)
17+
18+
foundTarget := giantGenericSlice[n/2]
19+
notFoundTarget := "___not_present___"
20+
21+
b.Run("Found/Contains", func(b *testing.B) {
22+
b.ReportAllocs()
23+
var sink bool
24+
for i := 0; i < b.N; i++ {
25+
sink = set.Contains(foundTarget)
26+
}
27+
_ = sink
28+
})
29+
b.Run("Found/InArray", func(b *testing.B) {
30+
b.ReportAllocs()
31+
var sink bool
32+
for i := 0; i < b.N; i++ {
33+
sink = set.InArray(foundTarget)
34+
}
35+
_ = sink
36+
})
37+
b.Run("NotFound/Contains", func(b *testing.B) {
38+
b.ReportAllocs()
39+
var sink bool
40+
for i := 0; i < b.N; i++ {
41+
sink = set.Contains(notFoundTarget)
42+
}
43+
_ = sink
44+
})
45+
b.Run("NotFound/InArray", func(b *testing.B) {
46+
b.ReportAllocs()
47+
var sink bool
48+
for i := 0; i < b.N; i++ {
49+
sink = set.InArray(notFoundTarget)
50+
}
51+
_ = sink
52+
})
53+
})
54+
}
55+
}

linkedhashset_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,3 +196,30 @@ func TestLinkedHashSetAsInterface(t *testing.T) {
196196
require.Equal(t, value.(testStruct), expectedArray[i])
197197
}
198198
}
199+
200+
func TestLinkedHashSetContains(t *testing.T) {
201+
t.Run("found", func(t *testing.T) {
202+
set := NewLinkedHashSet("02", "04", "06", "08")
203+
204+
require.True(t, set.Contains("02"))
205+
require.True(t, set.Contains("04"))
206+
require.True(t, set.Contains("06"))
207+
require.True(t, set.Contains("08"))
208+
})
209+
210+
t.Run("not found", func(t *testing.T) {
211+
set := NewLinkedHashSet("02", "04", "06", "08")
212+
require.False(t, set.Contains("01"))
213+
require.False(t, set.Contains("03"))
214+
require.False(t, set.Contains("05"))
215+
require.False(t, set.Contains("07"))
216+
})
217+
218+
t.Run("empty", func(t *testing.T) {
219+
set := NewLinkedHashSet[string]()
220+
require.False(t, set.Contains("01"))
221+
require.False(t, set.Contains("03"))
222+
require.False(t, set.Contains("05"))
223+
require.False(t, set.Contains("07"))
224+
})
225+
}

0 commit comments

Comments
 (0)