rust 如何转换一系列分隔的“数字”?

igetnqfo  于 2024-01-08  发布在  其他
关注(0)|答案(2)|浏览(145)

向量m包含从4857的“数字”,48对应于0491等。数字按顺序由13, 10的出现分隔。如何在下面的例子中得到n的结果[1073, 8705]

  1. fn main() {
  2. let m: Vec<u8> = vec![49, 48, 55, 51, 13, 10, 56, 55, 48, 53, 13, 10];
  3. let mut n: Vec<u32> = vec![];
  4. println!("m = {:?}", m);
  5. println!("n = {:?}", n);
  6. // ...
  7. println!("n = {:?}", n); // ? how get: [1073, 8705]
  8. }
  9. /*
  10. 0 - 48
  11. 1 - 49
  12. 2 - 50
  13. 3 - 51
  14. 4 - 52
  15. 5 - 53
  16. 6 - 54
  17. 7 - 55
  18. 8 - 56
  19. 9 - 57
  20. */

字符串
play.rust-lang.org

x8diyxa7

x8diyxa71#

尽管由于使用字符串而对运行时有很小的影响,但我仍然更喜欢Rust的成熟解析功能:

  1. let v: Vec<u8> = vec![49, 48, 55, 51, 13, 10, 56, 55, 48, 53, 13, 10];
  2. let s: String = String::from_utf8(v).unwrap();
  3. let n: Vec<_> = s.lines().map(|n| n.parse::<u32>().unwrap()).collect();
  4. println!("{n:?}");

字符串
对于字符串数组,将n.parse::<u32>()更改为n.parse::<String>()
Playground

hmtdttj4

hmtdttj42#

你不需要遍历String,你可以手动解析。

  1. fn main() {
  2. let m = vec![49_u8, 48, 55, 51, 13, 10, 56, 55, 48, 53, 13, 10];
  3. let mut curr_num = 0_u32;
  4. let mut curr_is_nonempty = false;
  5. let mut nums = Vec::new();
  6. let mut i = 0;
  7. while i < m.len() {
  8. if &m[i..i + 2] == &[13, 10] {
  9. nums.push(curr_num);
  10. curr_num = 0;
  11. curr_is_nonempty = false;
  12. i += 2;
  13. continue;
  14. }
  15. let val = (m[i] - b'0') as u32;
  16. curr_num = 10 * curr_num + val;
  17. curr_is_nonempty = true;
  18. i += 1;
  19. }
  20. if curr_is_nonempty {
  21. nums.push(curr_num);
  22. }
  23. println!("m = {:?}", m);
  24. println!("n = {:?}", nums);
  25. }

字符串

展开查看全部

相关问题