在HashMap中将char用作&str

时间:2019-12-01 00:15:33

标签: string rust char type-conversion lifetime

我想创建一个HashMap来映射单词-Vec中的&str-并将这些单词的字母相互映射。例如,vec!["ab", "b", "abc"]将转换为以下HashMap

{
    // Letters are keys, words which contain the keys are values
    "a" => ["ab", "abc"],
    "b" => ["ab", "bc", "abc"],
    "c" => ["bc", "abc"],
    // Words are keys, letters which are in the words are values
    "ab" => ["a", "b"],
    "abc" => ["a", "b", "c"],
}

我尝试了此代码[playground]:

let words = vec!["ab", "bc", "abc"];
let mut map: HashMap<&str, Vec<&str>> = HashMap::new();
for word in words.iter() {
    for letter in word.chars() {
        map.entry(letter).or_default().push(word);
        map.entry(word).or_default().push(letter);
    }
}

但是有一个问题:letter的类型为char,但是我需要一个&str,因为map仅接受&str作为键。我还尝试将letter转换为&str

for word in words.iter() {
    for letter in word.chars() {
        let letter = letter.to_string()
        // no changes

但是此代码创建了一个新的String,其生存期比map的生存期短。换句话说,letter在嵌套的for循环之后被删除,但是我得到了编译器错误。

如何在char中使用仅接受HashMap作为密钥的&str

1 个答案:

答案 0 :(得分:0)

我将地图分为两部分:

  • 一个是char -> Vec<&str>。它将字母映射到单词列表。
  • 第二个是&str -> Vec<char>,但我不知道您是否真的需要它:为什么不直接迭代chars的{​​{1}}?

    存储&str实际上只会使您使用的内存量增加一倍,除非Vec<char>例如

  • 按特定顺序排序(可能有必要也可能没有必要)。

如果您真的要将它们保存在一张地图中,我认为拥有Vec<char>会更容易。

问题似乎是HashMap<String, Vec<String>>接连给您一个chars,但您真正想要的却是一个char接一个,其中每个&str实际上包含一个单个字符。我在&str的文档中找不到类似的内容,但是也许有些地方会像这样进行迭代。

您可以使用&str解决该问题:

matches