#tuple #list #map

keylist

Elixir关键字列表的Rust版本

4个版本 (2个重大更新)

0.3.0 2022年8月4日
0.2.0 2020年6月1日
0.1.1 2020年5月29日
0.1.0 2020年5月28日

数据结构中排名第1074

每月下载量40
erlang-term中使用

Unlicense协议

49KB
1K SLoC

keylist

Keylist

类似于列表的映射包装,包含元组对。受Elixir关键字列表的启发。

因为它只是一个包含元组的列表,所以键可以是任何可以放入元组中的东西。这也意味着获取值并不高效。

对于更有用且相当类似的东西,请参阅:https://docs.rs/multimap

use keylist::Keylist;

let mut keylist = Keylist::from(vec![("a", 5), ("b", 2), ("a", 1)]);

assert_eq!(keylist.get(&"a"), Some(&5));

keylist.sort_by_value();

assert_eq!(keylist.get(&"a"), Some(&1));

keylist.push("z", 26);

assert_eq!(keylist.get(&"z"), Some(&26));

keylist.insert(1, "z", 2);

assert_eq!(keylist.get(&"z"), Some(&2));

assert_eq!(keylist.get_all(&"z"), vec![&2, &26]);

assert_eq!(keylist.get_key_value(&"b"), Some(&("b", 2)));

let mut swapped_keylist = keylist.into_swapped();

assert_eq!(swapped_keylist.get(&2), Some(&"z"));

assert_eq!(swapped_keylist.get_all(&2), vec![&"z", &"b"]);

swapped_keylist.sort();

assert_eq!(swapped_keylist.get_all(&2), vec![&"b", &"z"]);

swapped_keylist.extend(vec![(3, "b"), (2, "g")]);

assert_eq!(swapped_keylist.get_all(&2), vec![&"b", &"z", &"g"]);

将keylist转换为映射并返回

use std::collections::HashMap;
use std::iter::FromIterator;
use keylist::Keylist;

let keylist = Keylist::from(vec![("a", 5), ("b", 2), ("c", 1)]);

let mut map = HashMap::new();
map.extend(vec![("a", 5), ("b", 2), ("c", 1)]);

let map_from_keylist = HashMap::from_iter(keylist.clone());
let mut keylist_from_map = Keylist::from_iter(map.clone());
keylist_from_map.sort();

assert_eq!(map, map_from_keylist);
assert_eq!(keylist, keylist_from_map);

任意示例

use keylist::Keylist;

let mut keylist = Keylist::new();
keylist.push(vec![3.12, 0.12], "a");
keylist.push(vec![0.1235, 34.121551], "c");

assert_eq!(keylist.get(&vec![0.1235, 34.121551]), Some(&"c"));


HashKeylist

还有一个更高效的实现,后端由哈希表支持,因此键应该是可哈希的。

use keylist::HashKeylist;
use std::collections::HashMap;
use std::iter::FromIterator;

let mut map = HashMap::new();
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
map.insert("four", 4);

let mut keylist = HashKeylist::from_iter(map);
// sorts keys alphabetically
keylist.sort_by_key();

keylist.push("one", 11);
keylist.push("five", 5);
keylist.push("five", 1);

assert_eq!(
    vec![
        (&"four", &4),
        (&"one", &1),
        (&"three", &3),
        (&"two", &2),
        (&"one", &11),
        (&"five", &5),
        (&"five", &1),
    ],
    keylist.iter().collect::<Vec<_>>()
);

keylist.insert(2, "five", 12);

assert_eq!(
    vec![
        (&"four", &4),
        (&"one", &1),
        (&"five", &12),
        (&"three", &3),
        (&"two", &2),
        (&"one", &11),
        (&"five", &5),
        (&"five", &1),
    ],
    keylist.iter().collect::<Vec<_>>()
);

assert_eq!(Some(("five", 1)), keylist.pop());

assert_eq!(
    vec![
        (&"four", &4),
        (&"one", &1),
        (&"five", &12),
        (&"three", &3),
        (&"two", &2),
        (&"one", &11),
        (&"five", &5),
    ],
    keylist.iter().collect::<Vec<_>>()
);

assert_eq!(("two", 2), keylist.remove(4));

assert_eq!(
    vec![
        (&"four", &4),
        (&"one", &1),
        (&"five", &12),
        (&"three", &3),
        (&"one", &11),
        (&"five", &5),
    ],
    keylist.iter().collect::<Vec<_>>()
);

assert_eq!(
    vec![&"four", &"one", &"five", &"three", &"one", &"five"],
    keylist.keys().collect::<Vec<_>>()
);

assert_eq!(
    vec![&4, &1, &12, &3, &11, &5],
    keylist.values().collect::<Vec<_>>()
);

assert_eq!(
    vec![
        ("four", 4),
        ("one", 1),
        ("five", 12),
        ("three", 3),
        ("one", 11),
        ("five", 5),
    ],
    Vec::from(keylist)
)

许可证:Unlicense

依赖项

~0–305KB