如何将HashMap的值收集到向量中? [英] How do I collect the values of a HashMap into a vector?

查看:65
本文介绍了如何将HashMap的值收集到向量中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在文档中找不到将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 Scores 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆