rust 如何在列表的每个元素之间插入值?

xytpbqjk  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(100)

这个(playground):

let s = "Hello world!";
let splitted_string = s.split_terminator("").skip(1).collect::<Vec<&str>>();
println!("splitted_string: {:?}", splitted_string);

将产生以下输出:

splitted_string: ["H", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d", "!"]

如何在每个元素之间插入一个a并获得这样的内容?

["H", "a", "e", "a", "l", "a", "l", "a", "o", "a", " ", "a", "w", "a", "o", "a", "r", "a", "l", "a", "d", "a", "!"]
n8ghc7c1

n8ghc7c11#

已经有一个很好的.flat_map()答案,但是为了多样性,为了给予一个稍微不同的方法,我们可以通过使用.take()来删除结尾处的额外“a”:

fn main() {
    let s = "Hello world!";
    
    let interspersed = s.chars()
                        .flat_map(|c| [c, 'a'])
                        .take(s.chars().count() * 2 - 1)
                        .collect::<String>();
                        
    println!("interspersed: {:?}", interspersed);
}

产出:

interspersed: "Haealalaoa awaoaralada!"

我已经更新了答案,以解决字符串中的字节数与字节数不匹配的情况,方法是应用s.chars().count()而不是s.len()。请注意,s.chars().count()是一个O(n)操作。

atmip9wb

atmip9wb2#

它仍然是实验性的,但iter::intersperse确实做到了。
关于example

#![feature(iter_intersperse)]

let mut a = [0, 1, 2].iter().intersperse(&100);
assert_eq!(a.next(), Some(&0));   // The first element from `a`.
assert_eq!(a.next(), Some(&100)); // The separator.
assert_eq!(a.next(), Some(&1));   // The next element from `a`.
assert_eq!(a.next(), Some(&100)); // The separator.
assert_eq!(a.next(), Some(&2));   // The last element from `a`.
assert_eq!(a.next(), None);

与此同时,itertools::intersperse crate也具有相同的功能。
一种只使用当前稳定标准库的解决方案:

use std::iter;
fn main() {
    let s = "Hello world!";
    let result: Vec<char> = s
        .chars()
        .zip(iter::repeat('a'))
        .flat_map(|(a, sep)| vec![sep, a])
        .skip(1)
        .collect();
    println!("{:?}", result);
}

结果如下:

['H', 'a', 'e', 'a', 'l', 'a', 'l', 'a', 'o', 'a', ' ', 'a', 'w', 'a', 'o', 'a', 'r', 'a', 'l', 'a', 'd', 'a', '!']

Playground

相关问题