dev_tool/
collection_util.rs

1use std::{collections::HashSet, hash::Hash};
2
3pub struct CollectionUtil;
4
5/// vec常规操作
6impl CollectionUtil { 
7
8    /// 获取vec的第一个元素,不移除
9    pub fn first<'a, T>(vec: &'a Vec<T>) -> Option<&'a T> { 
10        if vec.len() > 0 { vec.get(0) } else { None }
11    }
12
13    /// 移除并获取vec的第一个元素
14    pub fn remove_first<T>(vec: &mut Vec<T>) -> Option<T> { 
15        if vec.len() > 0 { Some(vec.remove(0)) } else { None }
16    }
17
18    /// 获取vec的最后一个元素,不移除
19    pub fn last<'a, T>(vec: &'a Vec<T>) -> Option<&'a T> { 
20        vec.last()
21    }
22    
23    /// 获取vec的最后一个元素,移除
24    pub fn pop<T>(vec: &mut Vec<T>) -> Option<T> { 
25        vec.pop()
26    }
27
28    /// 反转向量中的元素顺序
29    pub fn reverse<T>(vec: &mut Vec<T>) { 
30        vec.reverse()
31    }
32
33    /// 移除重复的元素
34    pub fn distinct<T: Eq + Hash + Clone>(vec: &Vec<T>) -> Vec<T> { 
35        let mut hash_set = HashSet::new();
36        for item in vec.iter() {
37            hash_set.insert(item.clone());
38        }
39        hash_set.into_iter().collect()
40    }
41
42    /// 计算交集:两个集合中都存在的元素
43    pub fn intersection<T>(vec1: Vec<T>, vec2: Vec<T>) -> Vec<T>
44    where T: Eq + Hash + Clone {
45        // 转换为HashSet
46        let set1: HashSet<T> = vec1.into_iter().collect();
47        let set2: HashSet<T> = vec2.into_iter().collect();
48        // 计算交集:两个集合中都存在的元素
49        let result: Vec<T> = set1.intersection(&set2).cloned().collect();
50        result
51    }
52
53    /// 计算并集:两个集合中所有不重复的元素
54    pub fn union<T>(vec1: Vec<T>, vec2: Vec<T>) -> Vec<T>
55    where T: Eq + Hash + Clone {
56        let set1: HashSet<T> = vec1.into_iter().collect();
57        let set2: HashSet<T> = vec2.into_iter().collect();
58        // 计算并集:两个集合中所有不重复的元素
59        let result: Vec<_> = set1.union(&set2).cloned().collect();
60        result
61    }
62
63    /// 计算差集:set1中有而set2中没有的元素
64    pub fn difference<T>(vec1: Vec<T>, vec2: Vec<T>) -> Vec<T>
65    where T: Eq + Hash + Clone {
66        let set1: HashSet<T> = vec1.into_iter().collect();
67        let set2: HashSet<T> = vec2.into_iter().collect();
68        // 计算差集:set1中有而set2中没有的元素
69        let result: Vec<_> = set1.difference(&set2).cloned().collect();
70        result
71    }
72
73    /// 计算对称差集:只在其中一个集合中出现的元素
74    pub fn symmetric_difference<T>(vec1: Vec<T>, vec2: Vec<T>) -> Vec<T>
75    where T: Eq + Hash + Clone {
76        let set1: HashSet<T> = vec1.into_iter().collect();
77        let set2: HashSet<T> = vec2.into_iter().collect();
78        // 计算对称差集:只在其中一个集合中出现的元素
79        let result: Vec<_> = set1.symmetric_difference(&set2).cloned().collect();
80        result
81    }
82
83
84}
85
86
87#[cfg(test)]
88mod tests {
89    use std::collections::HashMap;
90
91
92    #[test]
93    fn test_remove_first() {
94        let map = HashMap::<i32, i32>::new();
95    }
96}
97