Rust中按首次出现顺序用第二个vector元素替换第一个vector对应元素的方法

优化实现方案
你原始的代码时间复杂度为O(n²),每次识别到首次出现的新元素都要全量遍历vec1做替换,存在冗余操作,vec1元素量较大时性能偏低。推荐使用哈希映射构建对应关系的方案,时间复杂度可优化至均摊O(n)。
核心逻辑是先遍历一次vec1,按元素首次出现的顺序绑定vec2的对应值存入哈希表,再遍历一次vec1完成替换即可,实现代码如下:
use std::collections::HashMap; fn main() { let vec1: Vec<&str> = vec!["12345","12345","11111","12345","11111"]; let vec2: Vec<&str> = vec!["abc","xyz"]; let mut mapping = HashMap::new(); let mut vec2_idx = 0; // 首次遍历构建原始值到目标值的映射 for &original_val in &vec1 { mapping.entry(original_val).or_insert_with(|| { let target_val = vec2[vec2_idx]; vec2_idx += 1; target_val }); } // 生成替换后的新向量,也可以直接修改原vec1 let replaced_vec: Vec<&str> = vec1.iter().map(|&val| mapping[val]).collect(); println!("{:?}", replaced_vec); // 输出 ["abc", "abc", "xyz", "abc", "xyz"] }
注意事项
- 需保证vec2的长度 ≥ vec1去重后的元素数量,否则会触发数组下标越界panic,可根据业务需求提前做长度校验,或者补充缺省值逻辑。
- 如果vec1的元素类型没有实现Hash、Eq trait,可以改用BTreeMap替代HashMap,仅需要元素实现Ord trait即可,不过性能会略低一些。
内容的提问来源于stack exchange,提问作者danshat
相关产品推荐
相关产品推荐

