当前位置: 首页 > 知识库问答 >
问题:

如何从结构向量中过滤出字符串向量

司马项明
2023-03-14

与结构向量相比,我有一个过滤掉字符串输入vec的工作解决方案。但是,我的代码似乎很复杂,我尝试使用iter::filter(https://doc.rust-lang.org/stable/std/iter/struct.Filter.html)简化代码。这引起了问题,因为迭代器返回的值是引用,不能直接使用。似乎我对iter的理解以及在结构向量中可以做什么需要刷新。下面是工作的简化过滤代码:

#[derive(Debug)]
pub struct Widget {
    name: String,
    pin: u16,
}

impl Widget{
    pub fn new(widget_name: String, widget_pin: String) -> Widget {
        let widget_pin_u16 = widget_pin.parse::<u16>().expect("Unable to parse");
        let nw = Widget {
            name: widget_name,
            pin: widget_pin_u16
        };
        return nw
    }
}

pub struct WidgetHolder {
    widgets: Vec<Widget>,
    widget_holder_name: String
}

impl WidgetHolder {
    fn add_widgets(&mut self, valid_widgets_found: Vec<String>) {
        let mut widgets_to_add: Vec<String> = Vec::new();
        for widget in valid_widgets_found {
            // The string musy be compared to pin field, so we're converting
            let widget_offset = widget
                .clone()
                .parse::<u16>()
                .expect("Unable to parse widget base into int.");
            // If it doesnt exist in our widgetHolder widgets vector, then lets add it.
            let mut widget_exists = false;
            for existing_widget in &self.widgets {
                if widget_offset == existing_widget.pin {
                    widget_exists = true;
                    break;
                }
            }
            if !widget_exists {
                widgets_to_add.push(widget.clone());
            }
        }
        
        if widgets_to_add.is_empty() {
            return;
        }
        
        for widget in widgets_to_add {
            let loaded_widget = Widget::new(self.widget_holder_name.clone(), widget);
            self.widgets.push(loaded_widget);
        }
    }
}


pub fn main() {
    let init_vec = Vec::new();
    let mut wh = WidgetHolder {
        widgets: init_vec,
        widget_holder_name: "MyWidget".to_string()
    };
    let vec1 = vec!["1".to_string(), "2".to_string(), "3".to_string()];
    wh.add_widgets(vec1);
    println!("{:?}", wh.widgets);

    let vec2 = vec!["2".to_string(), "3".to_string(), "4".to_string()];
    wh.add_widgets(vec2);
    println!("{:?}", wh.widgets);
}

有没有一种方法可以在不使用太多数据结构和循环的情况下清理此代码?过滤器api看起来很干净,但它是否与我试图变异(附加到它)的结构内部的向量一起工作?

在尝试获取堆栈跟踪后,我实际上让过滤器工作了...


    fn add_widgets(&mut self, valid_widgets_found: Vec<String>) {
        let widgets_to_add: Vec<String> = valid_widgets_found.into_iter()
                .filter(|widget_pin| {
                    let widget_offset = widget_pin.clone().parse::<u16>().expect("Unable to parse widget base into int.");
                    let mut widget_exists = false;
                    for existing_widget in &self.widgets {
                        if widget_offset == existing_widget.pin {
                            widget_exists = true;
                            break;
                        }
                    }
                    !widget_exists
                })
                .collect();
        
        if widgets_to_add.is_empty() {
            return;
        }
        
        for widget in widgets_to_add {
            let loaded_widget = Widget::new(self.widget_holder_name.clone(), widget);
            self.widgets.push(loaded_widget);
        }
    }

共有1个答案

佴博实
2023-03-14

我想出了答案。当我第一次尝试时,似乎是一个语法错误。对于将来寻找滤波器示例的人:


    fn add_widgets(&mut self, valid_widgets_found: Vec<String>) {
        let widgets_to_add: Vec<String> = valid_widgets_found.into_iter()
                .filter(|widget_pin| {
                    let widget_offset = widget_pin.clone().parse::<u16>().expect("Unable to parse widget base into int.");
                    let mut widget_exists = false;
                    for existing_widget in &self.widgets {
                        if widget_offset == existing_widget.pin {
                            widget_exists = true;
                            break;
                        }
                    }
                    !widget_exists
                })
                .collect();
        
        if widgets_to_add.is_empty() {
            return;
        }
        
        for widget in widgets_to_add {
            let loaded_widget = Widget::new(self.widget_holder_name.clone(), widget);
            self.widgets.push(loaded_widget);
        }
    }
 类似资料:
  • 我对R很陌生,我知道这是一个非常简单的问题,但我似乎无法理解。 我得到了字符矢量more.colors: 我必须用更多的。为向量、rep()和seq()添加颜色以创建向量: 到目前为止,我只有不使用rep()或seq()。 任何帮助都将不胜感激!

  • 简介 本章中,我将讲解向量和结构体。 向量是一组通过整数索引的数据。与C语言中的数组不同,一个向量可以储存不同类型的数据。与表相比,向量更加紧凑且存取时间更短。但从另外一方面来说,向量是通过副作用来操作的,这样会造成负担。 Scheme中的结构体与C语言中的结构体类似。但Scheme中的结构体比C语言中的更容易使用,因为Scheme为结构体自动创建了读取函数和写入函数,这受益于Lisp/Schem

  • 我正在尝试将嵌套列表结构转换为DataFrame。该列表类似于以下内容(它是来自解析的JSON的序列化数据,使用httr包读取)。 编辑:我最初的示例数据太简单了。实际数据是不完整的,这意味着并非每个对象都存在所有变量,并且一些列表元素是空的。我编辑了数据来反映这一点。

  • 我是C语言的新手,正在尝试根据另一个向量中的值对向量进行排序。我试图通过创建结构向量并使用STL对结构向量进行排序来实现这一点。结构有两个数据项,一个是CustomType,另一个是int。我希望按int字段的降序排序,因此包含一个布尔运算符重载,以便能够使用STL排序(算法)。 在函数中使用对CustomType向量和初始未初始化的int向量的引用构造结构,并将它们组合成结构向量。int的值是通

  • 问题内容: 在rails中,我使用gem进行搜索。我需要添加一个称为过滤器的字符串字段。如何添加到此插件? 我已经对此问题提出了一个问题Rails-如何在searchkick中添加更多字段以进行过滤 现在,我正在尝试使用字符串字段而不是布尔值,但搜索仍然无法正常工作。请同样帮助我。 我已经添加了一个条件,例如,根据此条件,我应该只获得活动用户(而不是“已删除”用户)。目前没有任何搜索数据在显示。

  • 本文向大家介绍如何在R中的字符串向量中找到相似的词?,包括了如何在R中的字符串向量中找到相似的词?的使用技巧和注意事项,需要的朋友参考一下 有时字符串向量中的字符串有拼写错误,我们希望提取相似的单词以避免这种拼写错误,因为相似的单词可能表示单词的正确和不正确形式。这可以通过使用 agrep 和 lapply 函数来实现。 在线示例1 输出结果 在线示例2 输出结果 在线示例3 输出结果