mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-04 12:52:28 +08:00
Hashmap: Add FilterByValue (#184)
The FilterByValue function is a method defined on the HashMap type. It generates a new HashMap containing only the elements that satisfy a specified condition, as determined by a predicate function applied to each element's value. Note: Will add later doc
This commit is contained in:
@@ -123,6 +123,25 @@ func (hm *HashMap) Iterate(iteratee func(key, value any)) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FilterByValue returns a filtered HashMap.
|
||||||
|
// If any value is not matching the perdicate function then it returns nil
|
||||||
|
// otherwise it returns the HashMap with selected values.
|
||||||
|
func (hm *HashMap) FilterByValue(perdicate func(value any) bool) *HashMap {
|
||||||
|
var filteredHM *HashMap
|
||||||
|
if hm.size > 0 {
|
||||||
|
for i := 0; i < len(hm.table); i++ {
|
||||||
|
item := hm.table[i]
|
||||||
|
if item != nil && perdicate(item.value) {
|
||||||
|
if filteredHM == nil {
|
||||||
|
filteredHM = NewHashMap()
|
||||||
|
}
|
||||||
|
filteredHM.Put(item.key, item.value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filteredHM
|
||||||
|
}
|
||||||
|
|
||||||
// Keys returns a slice of the hashmap's keys (random order)
|
// Keys returns a slice of the hashmap's keys (random order)
|
||||||
func (hm *HashMap) Keys() []any {
|
func (hm *HashMap) Keys() []any {
|
||||||
keys := make([]any, int(hm.size))
|
keys := make([]any, int(hm.size))
|
||||||
@@ -168,6 +187,11 @@ func (hm *HashMap) resize() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Size returns current size of Hashmap
|
||||||
|
func (hm *HashMap) Size() uint64 {
|
||||||
|
return hm.size
|
||||||
|
}
|
||||||
|
|
||||||
func (hm *HashMap) hash(key any) uint64 {
|
func (hm *HashMap) hash(key any) uint64 {
|
||||||
h := fnv.New64a()
|
h := fnv.New64a()
|
||||||
_, _ = h.Write([]byte(fmt.Sprintf("%v", key)))
|
_, _ = h.Write([]byte(fmt.Sprintf("%v", key)))
|
||||||
|
|||||||
@@ -105,3 +105,24 @@ func TestHashMap_GetOrDefault(t *testing.T) {
|
|||||||
assert.Equal(1, hm.GetOrDefault("a", 5))
|
assert.Equal(1, hm.GetOrDefault("a", 5))
|
||||||
assert.Equal(5, hm.GetOrDefault("d", 5))
|
assert.Equal(5, hm.GetOrDefault("d", 5))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestHashMap_FilterByValue(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
assert := internal.NewAssert(t, "TestHashMap_FilterByValue")
|
||||||
|
|
||||||
|
hm := NewHashMap()
|
||||||
|
|
||||||
|
hm.Put("a", 1)
|
||||||
|
hm.Put("b", 2)
|
||||||
|
hm.Put("c", 3)
|
||||||
|
hm.Put("d", 4)
|
||||||
|
hm.Put("e", 5)
|
||||||
|
hm.Put("f", 6)
|
||||||
|
|
||||||
|
filteredHM := hm.FilterByValue(func(value any) bool {
|
||||||
|
return value.(int) == 1 || value.(int) == 3
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.Equal(uint64(2), filteredHM.Size())
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user