加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何方便地将二维数组转换为二维向量?

发布时间: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()
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读