如何将字符串转换为字符列表?

时间:2017-12-15 09:48:01

标签: rust

由于字符串支持迭代但不支持索引,我想将字符串转换为字符列表。我有"abc",我想要['a', 'b', 'c']

它可以是任何类型,只要我可以索引它。 Vec<char>[char; 3]会很好,其他想法也会很有趣!

因为我处理很长的字符串,所以会更快。假设字符串是ASCII时效率更高的版本也很酷。

3 个答案:

答案 0 :(得分:11)

使用charsString上的str方法:

fn main() {
    let s = "Hello world!";
    let char_vec: Vec<char> = s.chars().collect();
    for c in char_vec {
        println!("{}", c);
    }
}

这里有live example

答案 1 :(得分:4)

我已经找到了这个解决方案:

let chars: Vec<char> = input.chars().collect();

在评论中有人建议使用.split(""),但它似乎是以一种令人讨厌的方式实现的:

println!("{:?}", "abc".split("").collect::<Vec<&str>>());

给出["", "a", "b", "c", ""]

答案 2 :(得分:1)

由于您正在尝试解决代码问世的第一天,我假设您需要比较两个连续字符并根据字符是否相同来更新累加器。您可以使用chars上的fold函数在不编制索引的情况下执行此操作。像这样(未经测试):

fn example(s: &str) -> u32 {
    let mut i = s.chars()
        .map(|c| c.to_digit(10).expect("Invalid input: Non-digit found!"));
    if let Some(first) = i.next() {
        let (tot, last) = i.fold((0, first), |acc, x| {
            let (tot, prev) = acc;
            if prev == x {
                (tot + prev, x)
            } else {
                (tot, x)
            }
        });
        if last == first {
            tot + last
        } else {
            tot
        }
    } else {
        0
    }
}

fold迭代器方法允许您在每个步骤更新该值的所有迭代器项上遍历值。这里的值是一个包含累计结果和前一个数字值的元组。我们用一些初始结果和第一个字符的值初始化它。然后在每一步我们将当前字符与从当前值中取得的前一个字符进行比较,根据比较结果更新累积结果,并使用更新的累加器和当前字符返回一个新值。

fold方法返回最后一个值,在我们的例子中包含累计结果和最后一个字符,此时您可以检查最后一个字符是否与第一个字符相同并更新结果你需要。