#default #default-value #hash-map #key-value

defaultmap

Provides a HashMap with an automatic default for missing keys

11 unstable releases

0.6.0 Aug 23, 2023
0.5.0 Sep 10, 2020
0.4.0 May 25, 2019
0.3.1 Jun 14, 2018
0.3.0 Jul 29, 2017

#815 in Data structures

Download history 2447/week @ 2024-07-24 3711/week @ 2024-07-31 1938/week @ 2024-08-07 2227/week @ 2024-08-14 1346/week @ 2024-08-21 1489/week @ 2024-08-28 1422/week @ 2024-09-04 1533/week @ 2024-09-11 1762/week @ 2024-09-18 937/week @ 2024-09-25 724/week @ 2024-10-02 1006/week @ 2024-10-09 1206/week @ 2024-10-16 1343/week @ 2024-10-23 1224/week @ 2024-10-30 1340/week @ 2024-11-06

5,422 downloads per month
Used in 7 crates (6 directly)

MIT license

46KB
950 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());

Dependencies

~0.4–1MB
~21K SLoC