HashMap[K, Array[V]]
Unlike standard HashMap, MultiHashMap provides a new empty array on the first access on a unknown key.
var m = new MultiHashMap[String, Char]
assert not m.has_key("four")
m["four"].add('i')
m["four"].add('i')
m["four"].add('i')
m["four"].add('i')
assert m.has_key("four")
assert m["four"] == ['i', 'i', 'i', 'i']
assert m["zzz"] == new Array[Char]
more_collections :: MultiHashMap :: add_one
Addv
to the array associated with k
.
more_collections :: MultiHashMap :: lookup_joined_values
Search the values inpe.greaters
from the most smaller elements that have a value.
more_collections :: MultiHashMap :: remove_one
Remove an occurrence ofv
from the array associated with k
.
more_collections $ MultiHashMap :: SELF
Type of this instance, automatically specialized in every classmore_collections $ MultiHashMap :: core_serialize_to
Actual serialization ofself
to serializer
more_collections $ MultiHashMap :: from_deserializer
Create an instance of this class from thedeserializer
more_collections $ MultiHashMap :: provide_default_value
Called by the underling implementation of[]
to provide a default value when a key
has no value
serialization :: Serializable :: accept_json_serializer
Refinable service to customize the serialization of this class to JSONserialization :: Serializable :: accept_msgpack_attribute_counter
Hook to customize the behavior of theAttributeCounter
serialization :: Serializable :: accept_msgpack_serializer
Hook to customize the serialization of this class to MessagePackmore_collections :: MultiHashMap :: add_one
Addv
to the array associated with k
.
serialization :: Serializable :: add_to_bundle
Called by[]=
to dynamically choose the appropriate method according
core :: Object :: class_factory
Implementation used byget_class
to create the specific class.
serialization :: Serializable :: core_serialize_to
Actual serialization ofself
to serializer
core :: Map :: defaultinit
core :: HashMap :: defaultinit
core :: MapRead :: defaultinit
core :: Object :: defaultinit
core :: MapRead :: filter_keys
Return all elements ofkeys
that have a value.
serialization :: Serializable :: from_deserializer
Create an instance of this class from thedeserializer
core :: MapRead :: get_or_default
Get the item atkey
or return default
if not in map
core :: MapRead :: get_or_null
Get the item atkey
or null if key
is not in the map.
core :: Object :: is_same_instance
Return true ifself
and other
are the same instance (i.e. same identity).
core :: Object :: is_same_serialized
Isself
the same as other
in a serialization context?
core :: Object :: is_same_type
Return true ifself
and other
have the same dynamic type.
core :: MapRead :: keys_sorted_by_values
Return an array of all keys sorted with their values usingcomparator
.
core :: MapRead :: lookup_all_values
Search all the values inpe.greaters
.
more_collections :: MultiHashMap :: lookup_joined_values
Search the values inpe.greaters
from the most smaller elements that have a value.
core :: MapRead :: lookup_values
Combine the values inpe.greaters
from the most smaller elements that have a value.
serialization :: Serializable :: msgpack_extra_array_items
Hook to request a larger than usual metadata arraycore :: Object :: output_class_name
Display class name on stdout (debug only).core :: MapRead :: provide_default_value
Called by the underling implementation of[]
to provide a default value when a key
has no value
more_collections :: MultiHashMap :: remove_one
Remove an occurrence ofv
from the array associated with k
.
serialization :: Serializable :: serialize_msgpack
Serializeself
to MessagePack bytes
serialization :: Serializable :: serialize_to
Serializeself
to serializer
serialization :: Serializable :: serialize_to_json
Serializeself
to JSON
core :: MapRead :: to_map_comparator
A comparator that compares things with their values in self.serialization :: Serializable :: to_pretty_json
Serializeself
to plain pretty JSON
core :: MapRead :: values_sorted_by_key
Return an array of all values sorted with their keys usingcomparator
.
# Simple way to store an `HashMap[K, Array[V]]`
#
# Unlike standard HashMap, MultiHashMap provides a new
# empty array on the first access on a unknown key.
#
# var m = new MultiHashMap[String, Char]
# assert not m.has_key("four")
# m["four"].add('i')
# m["four"].add('i')
# m["four"].add('i')
# m["four"].add('i')
# assert m.has_key("four")
# assert m["four"] == ['i', 'i', 'i', 'i']
# assert m["zzz"] == new Array[Char]
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)
if x != null then
x.add(v)
else
self[k] = [v]
end
end
redef fun provide_default_value(key) do
var res = new Array[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
# Search the values in `pe.greaters` from the most smaller elements that have a value.
#
# Elements without values are ignored.
#
# Basically, values defined in nearest greater elements of `pe` are inherited.
#
# ~~~
# var pos = new POSet[String]
# pos.add_chain(["E", "D", "C", "B", "A"])
# pos.add_chain(["D", "X", "B"])
#
# var map = new MultiHashMap[String, String]
# map["A"].append(["a", "1"])
# map["C"].append(["c", "2"])
# map["X"].append(["x", "2"])
# map["E"].add "e"
#
# assert map.lookup_joined_values(pos["B"]).has_exactly(["a", "1"])
# assert map.lookup_joined_values(pos["C"]).has_exactly(["c", "2"])
# assert map.lookup_joined_values(pos["D"]).has_exactly(["c", "x", "2"])
# ~~~
fun lookup_joined_values(pe: POSetElement[K]): Set[V]
do
var res = new Set[V]
for k in pe.poset.select_smallest(filter_keys(pe.greaters)) do res.add_all self[k]
return res
end
end
lib/more_collections/more_collections.nit:21,1--135,3