Rust:字符串数组的拼接、与 String 、 &str的选择

171 篇文章 20 订阅

一、问题的由来
1、由来
我曾用Julia写过以下字符串数组的方案,可以参考:
https://blog.csdn.net/wowotuo/article/details/52740161

2、具体的问题
一个字符串数组的数组,求其字符串数组元素中的元素之间一一拼接成新字符串数组。
a = [“a1”, “a2”, “a3”];
b = [“b1”, “b2”];
c = [“c1”, “c2”];
list = [a, b, c, …];
要求根据list得到一个结果集合,类似如下格式:
[“a1b1c1”, “a1b1c2”, “a1b2c1”, “a1b2c2”, “a2b1c1”, “a2b1c2”, ……]
即结果集合的每个元素是list内每个数组取且只取一个元素拼接成的一个字符串。
需要说明的是,要提出一个抽象的解决方案,并不限于a,b,c三个数组的拼接

二、如果用Rust来写,应如何写呢?

1、方案一: 用Vec < String > 方式

use std::ops::Deref;
use std::{thread, time};
fn get_new_strings(str1: Vec<String>, str2: Vec<String>) -> Vec<String> {
    let mut strs: Vec<String> = Vec::new();
    for s in &str1 {
        for v in &str2 {
            let temp: String = (s.deref()).to_string() + v;
            strs.push(temp);
        }
    }
    strs
}

fn main() {
    let sleep_seconds = std::time::Duration::from_secs(1000);
    let mut data = Vec::new();
    let data_0: Vec<String> = ["1", "2", "3"].iter().map(|x| x.to_string()).collect();
    let data_1: Vec<String> = ["a", "b", "c", "d"].iter().map(|x| x.to_string()).collect();
    let data_2: Vec<String> = ["e", "f", "g"].iter().map(|x| x.to_string()).collect();
    let data_3: Vec<String> = ["h", "i", "j", "k"].iter().map(|x| x.to_string()).collect();
    let data_4: Vec<String> = ["x", "y", "z"].iter().map(|x| x.to_string()).collect();
    data.push(data_1);
    data.push(data_2);
    data.push(data_3);
    data.push(data_4);
    let mut temp = data_0;
    for dt in data {
        temp = get_new_strings(temp, dt);
    }
    println!("temp:{:?} count:{:?}", temp, temp.len());
    thread::sleep(sleep_seconds);
}

以上方案的不足在于输入项比较麻烦。

2、方案二 :Vec<&str>

fn get_new_strs<'a>(str1: &Vec<&'a str>, str2: &Vec<&'a str>) -> Vec<String> {
    let mut strs: Vec<String> = Vec::new();
    for s in str1 {
        for v in str2 {
            //let temp: String = s + &v;
            let temp: String = s.to_string() + v;
            strs.push(temp);
        }
    }
    strs
}

即:

use std::ops::Deref;
use std::{thread, time};
//方案一
fn get_new_strings(str1: Vec<String>, str2: Vec<String>) -> Vec<String> {
    let mut strs: Vec<String> = Vec::new();
    for s in &str1 {
        for v in &str2 {
            //let temp: String = s + &v;
            let temp: String = (s.deref()).to_string() + v;
            strs.push(temp);
        }
    }
    strs
}
//方案二
fn get_new_strs<'a>(str1: &Vec<&'a str>, str2: &Vec<&'a str>) -> Vec<String> {
    let mut strs: Vec<String> = Vec::new();
    for s in str1 {
        for v in str2 {
            let temp: String = s.to_string() + v;
            strs.push(temp);
        }
    }
    strs
}

fn main() {
    let sleep_seconds = std::time::Duration::from_secs(1000);
    let mut data = Vec::new();
    let data_0 = vec!["1", "2", "3"];
    let data_1 = vec!["a", "b", "c", "d"];
    let data_2 = vec!["e", "f", "g"];
    let data_3 = vec!["h", "i", "j", "k"];
    let data_4 = vec!["x", "y", "z"];
    data.push(data_1);
    data.push(data_2);
    data.push(data_3);
    data.push(data_4);
    let mut outdata: Vec<String> = data_0.iter().map(|x| x.to_string()).collect();
    for _dt in data {
        //Vec<String>=>Vec<&str>
        let temp = outdata.clone();
        let _temp: Vec<&str> = temp.iter().map(|x| x.deref()).collect();
        outdata = get_new_strs(&_temp, &_dt);
    }
    println!("outdata:{:?}, count:{:?}", outdata, outdata.len());
    thread::sleep(sleep_seconds);
}

结果均一样:

在这里插入图片描述
三、关于String 与&str

//Vec < String > => Vec<&str>

    let mut outdata: Vec<String> = data_0.iter().map(|x| x.to_string()).collect();
    //Vec<String>=>Vec<&str>
    let temp = outdata.clone();
    let _temp: Vec<&str> = temp.iter().map(|x| x.deref()).collect();

这个可能看起来,比如对于Julia而言,是很轻松的。但是对于Rust而言,却不是轻松的。

四、其它

比如,如果能写成这样,可能是最方便的。想想看,为什么不能?

fn get_new_strs2<'a>(str1: &Vec<&'a str>, str2: &Vec<&'a str>) -> Vec<&'a str> {
    let mut strs: Vec<&'static str> = Vec::new();
    for s in str1 {
        for v in str2 {
            //let temp: String = s + &v;
            let temp: &'static str = &(s.to_string() + v);
            strs.push(temp);
        }
    }
    strs
}

在这里插入图片描述

Rust中的字符串是一个动态可变的数据类型,称为`String`。通过`String`类型,我们可以创建、修改、操作和处理字符串。 在Rust中,有多种方法可以创建`String`。最常见的方法是使用`format!`宏来构建一个字符串,或者通过`to_string()`方法将其他类型转换为字符串。 ```rust let hello = "Hello".to_string(); let world = String::from("World"); let message = format!("{} {}", hello, world); ``` `String`类型与基本类型(`&str`)之间可以互相转换。使用`&`运算符可以获取`String`类型的引用,而通过使用像`to_string()`这样的方法,可以将`&str`转换为`String`。 ```rust let hello: &str = "Hello"; let hello_string: String = hello.to_string(); ``` 在Rust中,可以使用`+`运算符将两个字符串连接起来,或使用`push_str`方法将一个字符串附加到另一个字符串上。这两种方法都会创建一个新的`String`对象。 ```rust let hello = String::from("Hello"); let world = String::from("World"); let hello_world = hello + &world; // 可以使用&运算符获取world的引用 ``` 当需要修改字符串时,Rust提供了很多有用的方法。我们可以使用`replace`方法来替换子字符串,使用`trim`方法来去除字符串两侧的空格,使用`split`方法将字符串拆分为多个部分等等。 ```rust let message = String::from("Hello World"); let replaced = message.replace("World", "Rust"); let trimmed = message.trim(); let mut parts = message.split_whitespace(); ``` 总之,Rust中的`String`类型提供了许多功能强大且安全的方法来创建、操作和处理字符串。它的灵活性和性能使得在处理字符串时可以更加方便、高效地进行操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值