Iterator.png

    创建一个Aggregate<E>接口,表示待遍历数据集:

    1. /*待遍历的数据集*/
    2. public interface Aggregate<E> {
    3. /*添加*/
    4. void addEle(E element);
    5. /*移除*/
    6. void removeEle(E element);
    7. /*获取迭代器*/
    8. CustomIterator<E> createCustomIterator();
    9. }

    创建一个Aggregate<E>接口的实现类ConcreteArrayAggregate<E>

    1. /*待遍历的数据集类型为:数组类型*/
    2. public class ConcreteArrayAggregate<E> implements Aggregate<E> {
    3. private E[] array = (E[]) new Object[0];
    4. @Override
    5. public void addEle(E element) {
    6. array = ArrayUtil.append(array, element);
    7. }
    8. @Override
    9. public void removeEle(E element) {
    10. array = ArrayUtil.removeEle(array, element);
    11. }
    12. @Override
    13. public CustomIterator<E> createCustomIterator() {
    14. return new ConcreteArrayCustomIterator<E>(array);
    15. }
    16. }

    创建一个Aggregate<E>接口的实现类ConcreteListAggregate<E>

    1. /*待遍历的数据集类型为:列表类型*/
    2. public class ConcreteListAggregate<E> implements Aggregate<E> {
    3. private List<E> list = new ArrayList<>();
    4. @Override
    5. public void addEle(E element) {
    6. list.add(element);
    7. }
    8. @Override
    9. public void removeEle(E element) {
    10. list.remove(element);
    11. }
    12. @Override
    13. public CustomIterator<E> createCustomIterator() {
    14. return new ConcreteListCustomIterator(list);
    15. }
    16. }

    创建一个CustomIterator接口,自定义的迭代器:

    1. /*自定义`Iterator`*/
    2. public interface CustomIterator<E> {
    3. /*是否有下一个元素*/
    4. boolean hasNext();
    5. /*获取下一个元素*/
    6. E next();
    7. /*移除当期元素*/
    8. default void remove() {
    9. throw new UnsupportedOperationException("remove");
    10. }
    11. }

    创建一个CustomIterator接口的实现类ConcreteArrayCustomIterator<E>

    1. /*数组类型的迭代器*/
    2. public class ConcreteArrayCustomIterator<E> implements CustomIterator<E> {
    3. private E[] array; //数据集
    4. private int currentIndex = 0; //当前下标
    5. public ConcreteArrayCustomIterator(E[] array) {
    6. this.array = array;
    7. }
    8. @Override
    9. public boolean hasNext() {
    10. return currentIndex < array.length;
    11. }
    12. public E next() {
    13. return array[currentIndex++];
    14. }
    15. }

    创建一个CustomIterator接口的实现类ConcreteListCustomIterator<E>

    1. /*列表类型的迭代器*/
    2. public class ConcreteListCustomIterator<E> implements CustomIterator<E> {
    3. private List<E> list; //数据集
    4. private int currentIndex = -1; //当前下标
    5. public ConcreteListCustomIterator(List<E> list) {
    6. this.list = list;
    7. }
    8. @Override
    9. public boolean hasNext() {
    10. return currentIndex < list.size() - 1;
    11. }
    12. @Override
    13. public E next() {
    14. return list.get(++currentIndex);
    15. }
    16. }

    客户端代码:

    1. public class Client {
    2. public static void main(String[] args) {
    3. System.out.println("================= 迭代字符串数组 ===================");
    4. Aggregate<String> stringAggregate = new ConcreteArrayAggregate<>(){{
    5. addEle("java");
    6. addEle("python");
    7. addEle("go");
    8. addEle("c++");
    9. //移除
    10. removeEle("java");
    11. removeEle("python");
    12. }};
    13. CustomIterator<String> stringCustomIterator = stringAggregate.createCustomIterator();
    14. while (stringCustomIterator.hasNext()){
    15. String next = stringCustomIterator.next();
    16. System.out.println("next = " + next);
    17. }
    18. System.out.println("================= 迭代数字列表 ===================");
    19. Aggregate<Integer> integerAggregate = new ConcreteListAggregate<>(){{
    20. addEle(11);
    21. addEle(12);
    22. addEle(13);
    23. addEle(14);
    24. addEle(15);
    25. }};
    26. CustomIterator<Integer> integerCustomIterator = integerAggregate.createCustomIterator();
    27. while (integerCustomIterator.hasNext()){
    28. Integer next = integerCustomIterator.next();
    29. System.out.println("next = " + next);
    30. }
    31. }
    32. }

    输出内容如下:

    1. ================= 迭代字符串数组 ===================
    2. next = go
    3. next = c++
    4. ================= 迭代数字列表 ===================
    5. next = 11
    6. next = 12
    7. next = 13
    8. next = 14
    9. next = 15