如何将HashMap的值收集到向量中? [英] How do I collect the values of a HashMap into a vector?
问题描述
在文档中找不到将HashMap
的值收集到Vec
中的方法.我有score_table: HashMap<Id, Score>
,我想将所有Score
放入all_scores: Vec<Score>
.
我很想使用values
方法(all_scores = score_table.values()
),但是由于值不是Vec
,所以它不起作用.
我知道Values
实现了ExactSizeIterator
特征,但是我不知道如何在不手动编写for循环并将向量中的值一次又一次地推入的情况下,将迭代器的所有值收集到向量中. /p>
我也尝试过use std::iter::FromIterator;
,但最终结果如下:
all_scores = Vec::from_iter(score_table.values());
expected type `std::vec::Vec<Score>`
found type `std::vec::Vec<&Score>`
感谢哈希映射宏拒绝进行类型检查,失败并显示误导性(且似乎是错误的)错误消息?,我将其更改为:
all_scores = Vec::from_iter(score_table.values().cloned());
并且不会对cargo check
产生错误.
这是一个好方法吗?
方法Iterator.collect
是为此特定任务设计的.正确的是,如果需要实际值的向量而不是引用,则需要.cloned()
(除非存储的类型实现了Copy
,例如基元),所以代码如下所示:
all_scores = score_table.values().cloned().collect();
在内部,collect()
仅使用FromIterator
,但它也可以推断输出的类型.有时没有足够的信息来推断类型,因此您可能需要显式指定所需的类型,例如:
all_scores = score_table.values().cloned().collect::<Vec<Score>>();
I can not find a way to collect the values of a HashMap
into a Vec
in the documentation. I have score_table: HashMap<Id, Score>
and I want to get all the Score
s into all_scores: Vec<Score>
.
I was tempted to use the values
method (all_scores = score_table.values()
), but it does not work since values is not a Vec
.
I know that Values
implements the ExactSizeIterator
trait, but I do not know how to collect all values of an iterator into a vector without manually writing a for loop and pushing the values in the vector one after one.
I also tried to use std::iter::FromIterator;
but ended with something like:
all_scores = Vec::from_iter(score_table.values());
expected type `std::vec::Vec<Score>`
found type `std::vec::Vec<&Score>`
Thanks to Hash map macro refuses to type-check, failing with a misleading (and seemingly buggy) error message?, I changed it to:
all_scores = Vec::from_iter(score_table.values().cloned());
and it does not produce errors to cargo check
.
Is this a good way to do it?
The method Iterator.collect
is designed for this specific task. You're right in that you need .cloned()
if you want a vector of actual values instead of references (unless the stored type implements Copy
, like primitives), so the code looks like this:
all_scores = score_table.values().cloned().collect();
Internally, collect()
just uses FromIterator
, but it also infers the type of the output. Sometimes there isn't enough information to infer the type, so you may need to explicitly specify the type you want, like so:
all_scores = score_table.values().cloned().collect::<Vec<Score>>();
这篇关于如何将HashMap的值收集到向量中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!