首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取iter定位方法中的指标?

如何获取iter定位方法中的指标?
EN

Stack Overflow用户
提问于 2020-08-10 01:05:00
回答 4查看 98关注 0票数 0

我正在尝试打印数组中的第一个数字,该数字不完全大于前一个数字(在下面的示例中,预期结果是1 )。

我编写&n > 0 &&是为了避免在第一个数字之前检查(不存在)数字。

代码语言:javascript
复制
fn main() {
    let numbers = [4, 5, 7];
    let result = numbers.iter().position(|&n| &n > 0 && n != numbers[&n - 1] + 1);
    println!("{:?}", result);
}

我得到了有关0的编译器错误

预期参考,已找到整数 帮助:考虑在这里借款:&0

基本上,我在尝试做这个JavaScript所做的事情:

代码语言:javascript
复制
numbers.find((n, i) => i && n != numbers[i - 1] + 1);

有人能告诉我我做错了什么吗?

我假设n是值,&n是索引。如果这是不正确的,那么我如何在lamba内得到索引呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-08-10 07:35:30

查看迭代器切片中每对连续项的另一种方法

代码语言:javascript
复制
fn find_non_consecutive(a: &[i32]) -> Option<i32> {
    a.windows(2).find(|x| x[0] + 1 != x[1]).map(|x| x[1])
}
票数 2
EN

Stack Overflow用户

发布于 2020-08-10 01:28:22

position用于搜索元素。由于需要检查数组中的所有元素,所以使用enumerate访问元素索引和值:

代码语言:javascript
复制
fn main() {
    let numbers = [4, 5, 7];
    let result = numbers.iter().enumerate().filter_map(|(i, &n)| {
        if i > 0 && n != numbers[i-1] + 1 {
            Some(n)
        } else {
            None
        }
    });
    println!("{:?}", result.collect::<Vec<i32>>());
}

游乐场

如果只需要找到第一个这样的元素,则可以使用find_map而不是filter_map

代码语言:javascript
复制
fn main() {
    let numbers = [4, 5, 7];
    let result = numbers.iter().enumerate().find_map(|(i, &n)| {
        if i > 0 && n != numbers[i-1] + 1 {
            Some(n)
        } else {
            None
        }
    });
    println!("{:?}", result);
}
票数 1
EN

Stack Overflow用户

发布于 2020-08-10 01:46:24

如果您查看Iterator::position的签名,您将看到它的predicate闭包参数实现了FnMut(Self::Item) -> bool

换句话说,您的论点&n<numbers.iter() as Iterator>::Item类型的,即&i32 (对numbers元素的引用)。Iterator::position不提供其predicate闭包对迭代索引的访问--正如Psidom所演示的,Iterator::enumerate就是这样做的。

但是,我建议对numbers数组进行索引并不是解决这个问题的非常惯用的方法。如果没有其他的,则不能更一般地将其应用于其他可迭代性。也许相反,在数组上使用两个迭代器,一个更远的元素,压缩它们并对它们的元素进行配对比较?

代码语言:javascript
复制
fn main() {
    let numbers = [4, 5, 7];
    
    let first = numbers.iter();
    let second = numbers.iter().skip(1);
    
    let result = first.zip(second)
        .find_map(|(&a, &b)| if b == a + 1 { None } else { Some(b) });
    
    println!("{:?}", result);
}

游乐场上看到它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63332856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档