struct AlternateIterator {
vec1: Vec<i32>,
vec2: Vec<i32>,
index1: usize,
index2: usize,
}
impl AlternateIterator {
fn new(vec1: Vec<i32>, vec2: Vec<i32>) -> Self {
AlternateIterator {
vec1,
vec2,
index1: 0,
index2: 0,
}
}
}
impl Iterator for AlternateIterator {
type Item = i32;
fn next(&mut self) -> Option<Self::Item> {
if self.index1 < self.vec1.len() && self.index2 < self.vec2.len() {
if self.index1 <= self.index2 {
let result = self.vec1.get(self.index1).cloned();
self.index1 += 1;
result
} else {
let result = self.vec2.get(self.index2).cloned();
self.index2 += 1;
result
}
} else if self.index1 < self.vec1.len() {
let result = self.vec1.get(self.index1).cloned();
self.index1 += 1;
result
} else if self.index2 < self.vec2.len() {
let result = self.vec2.get(self.index2).cloned();
self.index2 += 1;
result
} else {
None
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining1 = self.vec1.len() - self.index1;
let remaining2 = self.vec2.len() - self.index2;
let lower_bound = remaining1.min(remaining2) * 2 + remaining1.max(remaining2);
(lower_bound, Some(lower_bound))
}
}
状态维护说明
- 成员变量:
vec1
和vec2
是要迭代的两个Vec<i32>
。
index1
和index2
分别记录vec1
和vec2
当前迭代到的位置。初始化为0。
- 迭代逻辑:
- 在
next
方法中,首先判断vec1
和vec2
都还有元素时,根据index1
和index2
的大小决定返回vec1
还是vec2
中的元素,并将对应索引加1。
- 当其中一个
Vec
遍历完时,继续遍历另一个Vec
。
Iterator特型方法实现
next
方法:
- 根据当前
index1
和index2
的状态,返回vec1
或vec2
中的下一个元素,并更新相应的索引。当两个Vec
都遍历完时返回None
。
size_hint
方法:
- 计算并返回剩余元素的下限和上限估计。下限和上限相等,因为我们可以准确知道剩余元素的数量。下限计算为两个
Vec
中剩余元素较少的那个的两倍加上剩余元素较多的那个的数量。