string - 在HashMap中将char用作&str

标签 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

最佳答案

我将 map 分为两部分:

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

    存储Vec<char>本质上只会使您使用的内存量增加一倍,除非Vec<char>例如以特定顺序排序(可能有必要也可能没有必要)。

  • 如果您真的想将它们保存在一张 map 中,我想拥有HashMap<String, Vec<String>>会更容易。

    问题似乎是chars给您一个接一个的char,但您真正想要的是一个接一个的&str,其中每个&str实际上包含一个字符。我在&str的文档中没有找到类似的东西,但是也许在某些地方有这样的迭代。

    您可以使用matches解决它:
    let words = vec!["ab", "bc", "abc"];
    let mut map: HashMap<&str, Vec<&str>> = HashMap::new();
    for word in words.iter() {
        for letter in word.matches(|_| true) { // iterates over &str's that encompass one single character
            map.entry(letter).or_default().push(word);
            map.entry(word).or_default().push(letter);
        }
    }
    

    关于string - 在HashMap中将char用作&str,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59121473/

    相关文章:

    c++ void函数不改变字符串的值

    javascript - 如何在字符串中查找某些单词?

    arrays - 不可复制类型的数组初始化

    c++ - 不兼容的转换字符

    java - 我如何检查Java中一个句子中有多少个辅音和元音?

    java - 如果语句有多个变量

    java - Google map 查询返回的 JSON 包含像\x26 这样的编码字符(如何解码?)

    rust - 使用字符串访问向量元素

    rust - 结构和枚举之间的区别

    c++计算char数组中的数字数量?