X-Git-Url: http://nitlanguage.org diff --git a/lib/more_collections.nit b/lib/more_collections.nit index 3062d5e..81688d9 100644 --- a/lib/more_collections.nit +++ b/lib/more_collections.nit @@ -35,7 +35,20 @@ class MultiHashMap[K, V] super HashMap[K, Array[V]] # Add `v` to the array associated with `k`. + # # If there is no array associated, then create it. + # + # For the inverse operation, see `remove_one`. + # + # ``` + # var m = new MultiHashMap[String, Char] + # m.add_one("four", 'i') + # m.add_one("four", 'i') + # m.add_one("four", 'i') + # m.add_one("four", 'i') + # assert m.has_key("four") + # assert m["four"] == ['i', 'i', 'i', 'i'] + # ``` fun add_one(k: K, v: V) do var x = self.get_or_null(k) @@ -51,6 +64,44 @@ class MultiHashMap[K, V] self[key] = res return res end + + # Remove an occurrence of `v` from the array associated with `k`. + # + # If the associated array does not contain `v`, do nothing. If the + # associated array only contain one element and this element is `v`, remove + # the key `k`. + # + # In a nutshell, does the inverse operation of `add_one`. + # + # ``` + # var m = new MultiHashMap[String, Char] + # m["four"] = ['4', 'i', 'i', 'i', 'i'] + # m.remove_one("four", 'i') + # assert m["four"] == ['4', 'i', 'i', 'i'] + # + # m = new MultiHashMap[String, Char] + # m.add_one("one", '1') + # m.remove_one("one", '?') + # assert m["one"] == ['1'] + # m.remove_one("one", '1') + # assert not m.has_key("one") + # assert m["one"] == new Array[Char] + # + # m = new MultiHashMap[String, Char] + # m.add_one("one", '1') + # m.remove_one("two", '2') + # assert not m.has_key("two") + # assert m["one"] == ['1'] + # assert m["two"] == new Array[Char] + # ``` + fun remove_one(k: K, v: V) + do + var x = get_or_null(k) + if x != null then + x.remove(v) + if x.is_empty then keys.remove(k) + end + end end # Simple way to store an `HashMap[K1, HashMap[K2, V]]`