#dict #hashmap #default #defaultdict #defaulthashmap

defaultmap

Provides a HashMap with an automatic default for missing keys

9 releases

0.4.0 May 25, 2019
0.3.1 Jun 14, 2018
0.3.0 Jul 29, 2017
0.2.2 Jul 29, 2017
0.1.3 Apr 23, 2017

#201 in Data structures

Download history 5/week @ 2020-01-25 5/week @ 2020-02-01 39/week @ 2020-02-08 29/week @ 2020-02-15 43/week @ 2020-02-22 35/week @ 2020-02-29 63/week @ 2020-03-07 51/week @ 2020-03-14 56/week @ 2020-03-21 42/week @ 2020-03-28 70/week @ 2020-04-04 108/week @ 2020-04-11 29/week @ 2020-04-18 16/week @ 2020-04-25 14/week @ 2020-05-02 27/week @ 2020-05-09

182 downloads per month
Used in eson

MIT license

19KB
292 lines

defaultmap

Build Status codecov Latest Version Rust Documentation GitHub license

It can be useful to not have to worry about missing keys in a map. If a key is requested that doesn't have a value a default value is simply returned. This is exactly what this library provides.

Examples

Counter

A clear use case of this is when counting the unique elements in a list. Here you want to add one to the existing value in the map for that key. This is a problem for the first addition when there's no value for the key yet. With this library you can specify when creating the map that the default value should be zero.

# use defaultmap::*;
let nums = [1, 4, 3, 3, 4, 2, 4];
let mut counts:  DefaultHashMap<i32, i32> = DefaultHashMap::new(0);
// DefaultHashMap::default() is equivalent.

for num in nums.into_iter() {
    counts[*num] += 1;
}

println!("{:?}", counts);
// DefaultHashMap { map: {1: 1, 3: 2, 2: 1, 4: 3}, default: 0 }

# assert_eq!(1, counts[1]);
# assert_eq!(1, counts[2]);
# assert_eq!(2, counts[3]);
# assert_eq!(3, counts[4]);

Synonym lists

Another way the default map can be used is using a map filled with other collections, such as a a Vec, a HashMap or even another default map. Next follows some code to create a map where we start with tuples of synonyms and we end with a map that contains the list of synonyms for each word.

# use defaultmap::*;

let synonym_tuples = [
    ("nice", "sweet"),
    ("sweet", "candy"),
    ("nice", "entertaining"),
    ("nice", "good"),
    ("entertaining", "absorbing"),
];

let mut synonym_map: DefaultHashMap<&str, Vec<&str>> = DefaultHashMap::new(vec![]);
// DefaultHashMap::default() is equivalent.

for &(l, r) in synonym_tuples.into_iter() {
    synonym_map[l].push(r);
    synonym_map[r].push(l);
}

assert_eq!(synonym_map["good"], vec!["nice"]);
assert_eq!(synonym_map["nice"], vec!["sweet", "entertaining", "good"]);
assert_eq!(synonym_map["evil"], Vec::<&str>::new());

No runtime deps