我想创建一个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
?
答案 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