一、问题的由来
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
}