< 返回版块

ziyouwa 发表于 2021-08-10 15:08

Tags:rust map filter vec

根据item.data每一项的a进行过滤,凡是a为Empty或Unsupported的就不显示这个Data,不知道该怎么写了,想用map和filter。

#[derive(Debug)]
enum Detail {
    Empty,
    Unsupported,
    Message(String),
}
#[derive(Debug)]
struct Data {
    a: Detail,
    b: Detail,
}
#[derive(Debug)]
struct Item {
    name: String,
    data: Vec<Data>,
}

fn main() {
    let lists = vec! [
        Item {
            name: String::from("abc"),
            data: vec! [
                Data {
                    a: Detail::Empty,
                    b: Detail::Empty,
                },
                Data {
                    a: Detail::Unsupported,
                    b: Detail::Empty,
                },
                Data {
                    a: Detail::Message(String::from("msg1")),
                    b: Detail::Message(String::from("msg2")),
                }
            ],
        },
        Item {
            name: String::from("def"),
            data: vec! [
                Data {
                    a: Detail::Empty,
                    b: Detail::Message(String::from("msg3")),
                },
                Data {
                    a: Detail::Message(String::from("msg4")),
                    b: Detail::Empty,
                },
                Data {
                    a: Detail::Empty,
                    b: Detail::Message(String::from("msg2")),
                }
            ],
        }
    ];
    
    //比如上例,最终结果如:
    // [
    //      Item {
    //          name: "abc",
    //          data: [
    //                Data {
    //                  a: Message(
    //                        "msg1",
    //                    ),
    //                    b: Message(
    //                        "msg2",
    //                    ),
    //                },
    //            ],
    //      },
    //        Item {
    //            name: "def",
    //            data: [
    //                Data {
    //                    a: Message(
    //                        "msg4",
    //                    ),
    //                    b: Empty,
    //                }
    //            ],
    //        },
    //    ]
    
    println!("{:#?}",lists);
}

Ext Link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=12fe86123e0709e25bc5d7d85b36cf10

评论区

写评论
作者 ziyouwa 2021-08-11 15:43

非常感谢##puzc1993##大神耐心回答!借此再引申一个问题:在迭代末尾,通常是如何判断collect需要指定收集格式的呢?

puzc1993 2021-08-11 10:27
lists
    .iter_mut()
    .map(|item| {
        let mut i = 0;
        while i < item.data.len() {
            if item.data[i].a == Detail::Empty || item.data[i].a == Detail::Unsupported {
                item.data.remove(i);
            } else {
                i += 1;
            }
        }
    })
    .collect::<Vec<()>>();

--
👇
ziyouwa: 更进一步,如果是不破坏原有的lists,除了clone之外,有其他方式吗?

--
👇

puzc1993:     let lists = lists
        .into_iter()
        .map(|mut item| {
            item.data = item
                .data
                .into_iter()
                .filter(|data| data.a != Detail::Empty && data.a != Detail::Unsupported)
                .collect();
            item
        })
        .collect::<Vec<Item>>();

--
👇
ziyouwa: 非常感谢!确实实现了我的目的。不过我有点疑问:第一个map中,传入的item本身就是Item结构的了,能否不新建Item来实现?

--
👇
puzc1993: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fa5950110ea9a014192fdde855aabe4a

作者 ziyouwa 2021-08-11 09:34

更进一步,如果是不破坏原有的lists,除了clone之外,有其他方式吗?

--
👇

puzc1993:     let lists = lists
        .into_iter()
        .map(|mut item| {
            item.data = item
                .data
                .into_iter()
                .filter(|data| data.a != Detail::Empty && data.a != Detail::Unsupported)
                .collect();
            item
        })
        .collect::<Vec<Item>>();

--
👇
ziyouwa: 非常感谢!确实实现了我的目的。不过我有点疑问:第一个map中,传入的item本身就是Item结构的了,能否不新建Item来实现?

--
👇
puzc1993: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fa5950110ea9a014192fdde855aabe4a

puzc1993 2021-08-10 17:20
let lists = lists
    .into_iter()
    .map(|mut item| {
        item.data = item
            .data
            .into_iter()
            .filter(|data| data.a != Detail::Empty && data.a != Detail::Unsupported)
            .collect();
        item
    })
    .collect::<Vec<Item>>();

--
👇
ziyouwa: 非常感谢!确实实现了我的目的。不过我有点疑问:第一个map中,传入的item本身就是Item结构的了,能否不新建Item来实现?

--
👇
puzc1993: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fa5950110ea9a014192fdde855aabe4a

作者 ziyouwa 2021-08-10 16:58

非常感谢!确实实现了我的目的。不过我有点疑问:第一个map中,传入的item本身就是Item结构的了,能否不新建Item来实现?

--
👇
puzc1993: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fa5950110ea9a014192fdde855aabe4a

puzc1993 2021-08-10 16:07

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fa5950110ea9a014192fdde855aabe4a

1 共 6 条评论, 1 页