我想创建一个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/