【问题标题】:Get first element from HashMap从 HashMap 中获取第一个元素
【发布时间】:2017-12-24 22:35:30
【问题描述】:

我有一个HashMap,需要获取第一个元素:

type VarIdx = std::collections::HashMap<u16, u8>;

fn get_first_elem(idx: VarIdx) -> u16 {
    let it = idx.iter();
    let ret = match it.next() {
        Some(x) => x,
        None => -1,
    };
    ret
}

fn main() {}

但代码无法编译:

error[E0308]: match arms have incompatible types
 --> src/main.rs:5:15
  |
5 |       let ret = match it.next() {
  |  _______________^
6 | |         Some(x) => x,
7 | |         None => -1,
8 | |     };
  | |_____^ expected tuple, found integral variable
  |
  = note: expected type `(&u16, &u8)`
             found type `{integer}`
note: match arm with an incompatible type
 --> src/main.rs:7:17
  |
7 |         None => -1,
  |                 ^^

我该如何解决?

【问题讨论】:

  • 强烈鼓励您阅读您正在调用的任何方法的文档,尤其是当您遇到错误时。例如,HashMap::iter 有一个 tiny 数量的文档来解释您的所有问题:“一个迭代器以任意顺序访问所有键值对。迭代器元素类型是 (&amp;'a K, &amp;'a V)。”

标签: hashmap iterator rust


【解决方案1】:

HashMap::iter(&amp;Key, &amp;Value) 对上返回一个迭代器。你想要的是HashMap::values,它产生一个只产生HashMap的值的迭代器。

请注意,值的顺序是随机的。它与您输入值的顺序或值的实际值无关。

【讨论】:

    【解决方案2】:

    HashMap 中没有“第一个”项目。有no guarantees about the order,其中存储了值,也没有您将迭代它们的顺序。

    如果顺序很重要,那么也许您可以切换到BTreeMap,它会根据键保留顺序。

    如果您只需要获取遇到的第一个值,换句话说,任何值,您可以执行与原始代码类似的操作:创建一个迭代器,只取第一个值:

    fn get_first_elem(idx: VarIdx) -> i16 {
        match idx.values().next() {
            Some(&x) => x as i16,
            None => -1,
        }
    }
    

    values() 方法仅在值上创建一个迭代器。您的错误的原因是 iter() 将在键和值对上创建一个迭代器,这就是您收到错误 "expected tuple" 的原因。

    为了使它编译,我不得不改变一些其他的东西:-1 不是一个有效的u16 值所以必须变成i16,而你的值是u8 所以必须强制转换到i16

    作为另一个一般性评论,返回-1 表示失败并不是很“生锈”。这就是Option 的用途,并且鉴于next() 已经返回Option,这很容易实现:

    fn get_first_elem(idx: VarIdx) -> Option<u8> {
        idx.values().copied().next()
    }
    

    需要.copied() 才能将迭代器的&amp;u8 值转换为u8

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 2012-12-08
      • 2011-03-13
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 2022-08-17
      • 2021-12-08
      • 1970-01-01
      相关资源
      最近更新 更多