如何方便地将二维数组转换为二维向量?
发布时间:2020-12-15 04:49:45 所属栏目:Java 来源:网络整理
导读:我正在关注 Rust-wasm tutorial,我希望能够在生命游戏中轻松地将一艘船(一个真正的形状)添加到宇宙中. 作为第一步,我想将表示形状的0或1的二维数组转换为表示宇宙中形状坐标的索引向量. 我有一段工作代码,但我想让它更方便用户: const WIDTH: u32 = 64;cons
我正在关注
Rust-wasm tutorial,我希望能够在生命游戏中轻松地将一艘船(一个真正的形状)添加到宇宙中.
作为第一步,我想将表示形状的0或1的二维数组转换为表示宇宙中形状坐标的索引向量. 我有一段工作代码,但我想让它更方便用户: const WIDTH: u32 = 64; const HEIGHT: u32 = 64; /// glider: [[0,1,0],[0,1],[1,1]] fn make_ship(shape: Vec<Vec<u32>>) -> Vec<u32> { let mut ship: Vec<u32> = Vec::new(); for row_idx in 0..shape.len() { for col_idx in 0..shape[row_idx].len() { let cell = shape[row_idx][col_idx]; if cell == 1 { ship.push(col_idx as u32 + row_idx as u32 * WIDTH); } } } ship } #[test] fn glider() { let glider = vec![vec![0,vec![0,vec![1,1]]; println!("{:?}",make_ship(glider)); } 测试显示了我的问题:vec!s的详细程度.理想情况下,我希望能够在没有所有vec的情况下编写它! make_ship的代码不应该关心形状数组的大小.理想的例子: let glider = [[0,]; 问题是:如何用简单的数组很好地表达形状,并使函数make_ship采用任意大小的二维向量? 解决方法
使用自定义
macro可以减少vec!s的数量:
#[macro_export] macro_rules! vec2d { ($($i:expr),+) => { // handle numbers { let mut ret = Vec::new(); $(ret.push($i);)* ret } }; ([$($arr:tt),+]) => { // handle sets { let mut ret = Vec::new(); $(ret.push(vec!($arr));)* ret } }; } fn main() { let glider = vec2d![[0,1]]; let glider2 = vec2d![[0,0]]; println!("{:?}",glider); // [[0,1]] println!("{:?}",glider2); // [[0,0]] } 在Rust的迭代器的帮助下,您的初始函数也可以使用一些改进: fn make_ship(shape: Vec<Vec<u32>>) -> Vec<u32> { shape .iter() .enumerate() .flat_map(|(row,v)| { v.iter().enumerate().filter_map(move |(col,x)| { if *x == 1 { Some(col as u32 + row as u32 * WIDTH) } else { None } }) }) .collect() } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 返回Java节点中的节点列表父节点可以有多个子节点
- java – Android:从日期开始获取星期几?
- java – 使用drawLine扩展Graphics类(double,double,double
- java – jdk源代码中的神秘评论:// HD,第2-1节
- java – 编写一个程序,用于在8 x 8板上放置一些经过修改的大
- java – 当我排序列表它的迭代器会发生什么?
- springboot使用JdbcTemplate完成对数据库的增删改查功能
- Android 获取屏幕分辨率大小 获取屏幕宽高
- 在jmeter的beanshell中用java获取系统当前时间的简单实例
- SpringBoot获取yml和properties配置文件的内容