diff --git a/README.md b/README.md index 0d22bfa..443c37d 100644 --- a/README.md +++ b/README.md @@ -400,6 +400,10 @@ func main() { m.Clear() // empty m.Empty() // true m.Size() // 0 + + // Other: + m.Min() // Returns the minimum key and its value from map. + m.Max() // Returns the maximum key and its value from map. } ``` diff --git a/maps/treemap/treemap.go b/maps/treemap/treemap.go index 06d6185..6d228cb 100644 --- a/maps/treemap/treemap.go +++ b/maps/treemap/treemap.go @@ -73,16 +73,6 @@ func (m *Map) Get(key interface{}) (value interface{}, found bool) { return m.tree.Get(key) } -// Returns the left-most element in the tree map (minimum). -func (m *Map) Left() (key interface{}) { - return m.tree.Left() -} - -// Returns the right-most element in the tree map (maximum). -func (m *Map) Right() (key interface{}) { - return m.tree.Right() -} - // Remove the element from the map by key. // Key should adhere to the comparator's type assertion, otherwise method panics. func (m *Map) Remove(key interface{}) { @@ -114,6 +104,24 @@ func (m *Map) Clear() { m.tree.Clear() } +// Returns the minimum key and its value from the tree map. +// Returns nil, nil if map is empty. +func (m *Map) Min() (key interface{}, value interface{}) { + if node := m.tree.Left(); node != nil { + return node.Key, node.Value + } + return nil, nil +} + +// Returns the maximum key and its value from the tree map. +// Returns nil, nil if map is empty. +func (m *Map) Max() (key interface{}, value interface{}) { + if node := m.tree.Right(); node != nil { + return node.Key, node.Value + } + return nil, nil +} + func (m *Map) String() string { str := "TreeMap\n" str += m.tree.String() diff --git a/maps/treemap/treemap_test.go b/maps/treemap/treemap_test.go index 9bdfd63..c48c454 100644 --- a/maps/treemap/treemap_test.go +++ b/maps/treemap/treemap_test.go @@ -60,14 +60,14 @@ func TestTreeMap(t *testing.T) { t.Errorf("Got %v expected %v", actualValue, expectedValue) } - // test Left() - if actualValue, expectedValue := fmt.Sprintf("%d", m.Left()), "1"; actualValue != expectedValue { - t.Errorf("Got %v expected %v", actualValue, expectedValue) + // test Min() + if key, value := m.Min(); key != 1 || value != "a" { + t.Errorf("Got %v expected %v", key, 1) } - // test Right() - if actualValue, expectedValue := fmt.Sprintf("%d", m.Right()), "7"; actualValue != expectedValue { - t.Errorf("Got %v expected %v", actualValue, expectedValue) + // test Max() + if key, value := m.Max(); key != 7 || value != "g" { + t.Errorf("Got %v expected %v", key, 7) } // key,expectedValue,expectedFound @@ -168,6 +168,15 @@ func TestTreeMap(t *testing.T) { t.Errorf("Got %v expected %v", actualValue, true) } + // test Min() + if key, value := m.Min(); key != nil || value != nil { + t.Errorf("Got %v expected %v", key, nil) + } + + // test Max() + if key, value := m.Max(); key != nil || value != nil { + t.Errorf("Got %v expected %v", key, nil) + } } func BenchmarkTreeMap(b *testing.B) {