[Rust] Top 10 các hàm được sử dụng trong iterator để thao tác với collection
Kỹ năng biến đổi các vector này sang các dạng khác nhau khá quan trọng trong khi lập trình. May mắn thay Rust có một tá các hàm để thao tác với kiểu Vector này Dưới đây là 10 mini bài toán để rèn luyện kỹ năng sử dụng iterator
Câu hỏi mini
Bài 1.
Cho mảng let v1 = [ 1,2,3,4,5]
. Muốn: r1 = [1, 4, 9, 16, 25]
(Bình phương các số trong mảng)
Bài 2.
Cho mảng let v1 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9]
. Muốn tìm các sỗ chẵn r1 = [2,4,6,8]
Bài 3.
Cho mảng let v1 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9]
. Muốn tính tích các số trong mảng này
Bài4.
Cho mảng v1 = [1,2, 3, 4, 5]
và v2 = ["Rust", "Go", "C++", "JS", "PHP"]
. Muốn tạo tuple t = [(1, "Rust"),(2, "Go"), (3, "C++"), (4, "JS"), (5, "PHP")]
Bài5.
Cho v1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
. Muốn có 3 vector: r1= [1, 2, 3], r2= [4, 5, 6], r3= [7, 8, 9]
(nhóm theo cụm 3 cái một)
Bài 6.
Cho v1 = [1, 2, 3]
và v2= [4, 5, 6]
và v3=[7, 8, 9]
. Muốn r1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
(Gộp 3 mảng lại)
Bài 7.
Cho v1 = [ 2, 4, 6, 8, 10]
. Cần kiểm tra tất cả các số trong mảng là sỗ chẵn hay không?
Bài 8.
Cho v1 = [10,30, 50, 25, 150, 50, 30]
. Kiểm tra xem tất cả các số trong mảng có bé hơn 100 không.
Bài 9.
Cho v1 = [1, 2, 3, 4, 5, 8, 9, 10, 15]
. Kiểm tra xem đây có phải gồm các số tăng dần hay không?
Bài 10.
Cho v1 = [5, 10, 15]
. Tạo một mảng mà r1 = [5, 10, 15, 5, 10, 15.... 5, 10, 15]
(10 lần mảng v1)
Đáp án:
- Sử dụng
map
let v1 = [ 1,2,3,4,5];
let r1= v1.into_iter().map(|it| it * it).collect::<Vec<_>>();
- Sử dụng
filter
let v1 = [ 1, 2,3,4,5, 6, 7, 8, 9];
let even_numbers = v1.filter(|it| *it % 2 == 0 ).collect::<Vec<_>>();
- Sử dụng
fold
let v1= [ 1, 2, 3, 4, 5, 6, 7, 8, 9];
let product = v1.iter().fold(1, |acc, it| acc * it);
Trong đó 1: là trị khởi tạo , acc là giá trị tích luỹ sau mỗi khi duyệt qua từng số
- Sử dụng
zip
let v1 = [1,2,3,4,5];
for (e1, e2) in v1.iter().zip(v2.iter()) {
println!(“e1: {e1}, e2: {e2}”);
}
- Sử dụng
chunks
let v1 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
for group in v1.chunks(3) {
println!(“Group: {group:?}”);
}
- Sử dụng
chain
let v1 = [1, 2, 3];
let v2= [4, 5, 6];
let v3=[7, 8, 9];
let r1 = v1.iter().chain(v2.iter()).chain(v3.iter()).collect::<Vec<_>>();
- Sử dụng
all
let v1 = [ 2, 4, 6, 8, 10];
if v1.iter().all( |it| *it % 2 == 0) {
println!("All even");
} else {
println!("All are not even");
}
- Sử dụng
any
let v1 = [10,30, 50, 25, 150, 50, 30];
if v1.iter().any( |it| *it > 100) {
println!("Some are above 100");}
else {
println!("None are above 100");
}
- Sử dụng
windows
. Nó là hàm củaslice
, ko phải củaiterator
let v1 = [1, 2, 3, 4, 5, 8, 9, 10, 15];
if v1.windows(2).all(|group| group[0] < group[1]) {
println!("Numbers are ascending");
} else {
println!("Numbers are not ascending");
}
- Sử dụng
cycle
let v1 = [5, 10, 15];
let r1 = v1.iter().cycle().take(10),collect::<Vec<_>>();