第十八章 迭代器模式

news2025/1/20 7:09:08

文章目录

  • 前言
  • 一、迭代器模式基本介绍
  • 二、迭代器模式应用实例
    • 完整代码
    • Department 系
    • ComputerCollegeIterator 计算机学院迭代器
    • InfoColleageIterator 信息工程学院迭代器
    • College 学院接口
    • ComputerCollege 计算机学院
    • InfoCollege 信息工程学院
    • OutPutImpl 操作迭代器
    • Clint 测试
  • 三、迭代器模式在 JDK-ArrayList 集合应用的源码分析
  • 四、迭代器模式的注意事项和细节


前言

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


一、迭代器模式基本介绍

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二、迭代器模式应用实例

在这里插入图片描述
在这里插入图片描述

完整代码

Department 系

package tanchishell.SJMS.iterator;


//系
public class Department {

    private String name;
    private String desc;

    public Department(String name, String desc) {
        super();
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

ComputerCollegeIterator 计算机学院迭代器

package tanchishell.SJMS.iterator;

import java.util.Iterator;

public class ComputerCollegeIterator implements Iterator {
    //这里我们需要 Department 是以怎样的方式存放=>数组
    Department[] departments;
    int position = 0; //遍历的位置

    public ComputerCollegeIterator(Department[] departments) {
        this.departments = departments;
    }

    //判断是否还有下一个元素
    @Override
    public boolean hasNext() {

        if (position >= departments.length || departments[position] == null) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public Object next() {

        Department department = departments[position];
        position += 1;
        return department;
    }

    //删除的方法,默认空实现
    public void remove() {
    }
}

InfoColleageIterator 信息工程学院迭代器

package tanchishell.SJMS.iterator;

import java.util.Iterator;
import java.util.List;

public class InfoColleageIterator implements Iterator {

    List<Department> departmentList; // 信息工程学院是以 List 方式存放系
    int index = -1;//索引

    public InfoColleageIterator(List<Department> departmentList) {
        this.departmentList = departmentList;
    }

    //判断 list 中还有没有下一个元素
    @Override
    public boolean hasNext() {
        if (index >= departmentList.size() - 1) {
            return false;
        } else {
            index += 1;
            return true;
        }
    }

    @Override
    public Object next() {

        return departmentList.get(index);
    }

    //空实现 remove
    public void remove() {
    }
}

College 学院接口

package tanchishell.SJMS.iterator;

import java.util.Iterator;

//学院
public interface College {

    public String getName();

    //增加系的方法
    public void addDepartment(String name, String desc);

    //返回一个迭代器,遍历
    public Iterator createIterator();
}

ComputerCollege 计算机学院

package tanchishell.SJMS.iterator;

import java.util.Iterator;

public class ComputerCollege implements College {

    Department[] departments;
    int numOfDepartment = 0;// 保存当前数组的对象个数

    public ComputerCollege() {
        departments = new Department[5];
        addDepartment("Java 专业", " Java 专业 ");
        addDepartment("PHP 专业", " PHP 专业 ");
        addDepartment("大数据专业", " 大数据专业 ");
    }

    @Override
    public String getName() {

        return "计算机学院";
    }

    @Override
    public void addDepartment(String name, String desc) {

        Department department = new Department(name, desc);
        departments[numOfDepartment] = department;
        numOfDepartment += 1;
    }

    @Override
    public Iterator createIterator() {

        return new ComputerCollegeIterator(departments);
    }
}

InfoCollege 信息工程学院

package tanchishell.SJMS.iterator;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class InfoCollege implements College {

    List<Department> departmentList;

    public InfoCollege() {
        departmentList = new ArrayList<Department>();
        addDepartment("信息安全专业", " 信息安全专业 ");
        addDepartment("网络安全专业", " 网络安全专业 ");
        addDepartment("服务器安全专业", " 服务器安全专业 ");
    }


    @Override
    public String getName() {

        return "信息工程学院";
    }

    @Override
    public void addDepartment(String name, String desc) {

        Department department = new Department(name, desc);
        departmentList.add(department);
    }

    @Override
    public Iterator createIterator() {

        return new InfoColleageIterator(departmentList);
    }
}

OutPutImpl 操作迭代器

package tanchishell.SJMS.iterator;

import java.util.Iterator;
import java.util.List;

public class OutPutImpl {


    //学院集合
    List<College> collegeList;

    public OutPutImpl(List<College> collegeList) {
        this.collegeList = collegeList;
    }

    //遍历所有学院,然后调用 printDepartment 输出各个学院的系
    public void printCollege() {
        //从 collegeList 取出所有学院, Java 中的 List 已经实现 Iterator
        Iterator<College> iterator = collegeList.iterator();
        while (iterator.hasNext()) {
            //取出一个学院
            College college = iterator.next();
            System.out.println("=== " + college.getName() + "=====");
            printDepartment(college.createIterator()); //得到对应迭代器
        }
    }

    //输出 学院输出 系
    public void printDepartment(Iterator iterator) {
        while (iterator.hasNext()) {
            Department d = (Department) iterator.next();
            System.out.println(d.getName());
        }
    }
}

Clint 测试

package tanchishell.SJMS.iterator;

import java.util.ArrayList;
import java.util.List;

public class Client {

    public static void main(String[] args) {
        //创建学院
        List<College> collegeList = new ArrayList<College>();
        ComputerCollege computerCollege = new ComputerCollege();
        InfoCollege infoCollege = new InfoCollege();
        collegeList.add(computerCollege);
        collegeList.add(infoCollege);
        OutPutImpl outPutImpl = new OutPutImpl(collegeList);
        outPutImpl.printCollege();
    }
}


输出

=== 计算机学院=====
Java 专业
PHP 专业
大数据专业
=== 信息工程学院=====
信息安全专业
网络安全专业
服务器安全专业

三、迭代器模式在 JDK-ArrayList 集合应用的源码分析

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、迭代器模式的注意事项和细节

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/469288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个恶意下载器的逆向分析

Die查壳, 发现没有加壳, 是使用VC编写的64位程序 丢入VT用杀毒引擎和沙箱扫, 爆红基本可以确定其属于恶意软件: 查看其PE节区发现其包含了资源节, 内部可能藏有隐藏模块 查看一下这个程序导入的dll中发现了如下特别的地方 并且其还使用了LoadLibrary和GetProcAddre…

使用aardio写一个基于pyocd的单片机下载器

1 新建工程 最开始本来是打算调用pyocd 的python api的&#xff0c;但是一个是内嵌包一直安装出问题&#xff0c;一个是考虑到本地pack不想重复安装和管理&#xff0c;于是就转做pyocd的前端了&#xff0c;也就是直接调用pyocd&#xff0c;根据返回数据解析&#xff0c;然后执…

NumPy之矩阵、向量、线性代数等的操作

NumPy之矩阵、向量、线性代数 NumPy矩阵和向量矩阵向量创建向量创建矩阵访问元素转置矩阵矩阵加减乘除矩阵向量乘法矩阵求逆矩阵的迹向量点积向量范数 NumPy线性代数计算矩阵乘积计算矩阵的逆解线性方程组 NumPy矩阵和向量 矩阵 在NumPy中&#xff0c;矩阵可以看作是一个二维数…

【Django】Django ORM Cookbook--20230427

英文版http://books.agiliq.com/projects/django-orm-cookbook/en/latest/ 中文版https://django-orm-cookbook-zh-cn.readthedocs.io/zh_CN/latest/query.html 查询和筛选 1. 如何查看Django ORM查询集的原生SQL&#xff1f; >>> queryset Event.objects.all() &…

JVM内存模型和结构

JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一个虚构出来的计算机&#xff0c;有着自己完善的硬件架构&#xff0c;如处理器、堆栈等。 为什么需要JVM&#xff1f; Java语言使用Java虚拟机屏蔽了与具体平台相关的信息&#xff0c;使…

QT笔记——第三方开源库停靠窗口类似QDockWidget

我们想要一个类似于Visual Studio 2019的dockwidget 停靠窗口 一个开源库&#xff1a;类似于Visual Studio 2019 dockwidget 的开源库 下载&#xff0c;解压下来 使用vs qt 插件打开src文件夹下的 src.pro 生成如下&#xff1a; 我们来运行它的例子&#xff1a; 使用vs qt …

【Vue工程】001-Vite 创建 Vue-TypeScript 项目

【Vue工程】001-Vite 创建 Vue-TypeScript 项目 文章目录 【Vue工程】001-Vite 创建 Vue-TypeScript 项目一、环境二、创建项目1、pnpm 创建 Vite 项目2、设置项目名3、选择vue4、选择 TypeScript5、创建完成6、安装与启动7、访问 http://localhost:5173/8、默认生成的项目结构…

LeetCode0718.最长重复子数组 Go语言AC笔记

时间复杂度&#xff1a;O(n)&#xff0c;空间复杂度&#xff1a;O(n) 解题思路 动态规划思想。令dp[i][j]表示两数组以nums1[i]和nums2[j]为起始元素的公共前缀最大长度&#xff0c;所以如果nums1[i]和nums2[j]元素相同&#xff0c;那么dp[i][j]dp[i1][j1]&#xff0c;否则dp[…

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp合并偏振相机4个角度的图像并显示(C#)

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp合并偏振相机4个角度的图像并显示&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机偏振相机的技术背景代码案例分享1&#xff1a;引用合适的类文件2&#xff1a;回调函数里联合BGAPI SDK和OpenCVSharp合并偏…

Leetcode刷题日志2.0

目录 前言&#xff1a; 1.数字的补数 2.最大连续 1 的个数 3.下一个更大元素 I 4.斐波那契数 5.提莫攻击 6.557. 反转字符串中的单词 III 前言&#xff1a; 今天就分享一下最近刷到的leetcode习题吧 &#xff0c;编程语言&#xff1a;Python3。废话不多说&#xff0…

【备战蓝桥杯国赛-国赛真题】2022

思路 题目的一是就是从1~2022这2022个数中挑选十个数&#xff0c;使其的总和为2022&#xff0c;如果做过背包问题&#xff0c;那么思路就很好出来了&#xff0c;每个数无非就是选与不选&#xff0c;每个数有他们的权值&#xff0c;权值就等于它们本身的值&#xff0c;抽象成背…

java调用百度的接口获取起始位置的距离

需求:校验收货地址是否超出配送范围 重要: 做该需求的思路就是通过卖家和卖家具体的地址信息,来获取到二者的经纬度, 此时可以使用百度的 "地理编码服务",即可获取对应的经纬度 第二步,就是通过二者的经纬度,按照百度接口的要求,发送,即可获取到包含二者距离的JSON串…

循环语句for

for循环 循环和遍历的概念 循环&#xff08;Loop&#xff09;和遍历&#xff08;Traversal&#xff09;是两个在计算机编程中经常使用的概念。 循环是一种重复执行一段代码的结构。通过循环&#xff0c;可以在满足一定条件的情况下&#xff0c;多次执行相同的代码。循环语句…

mysql8.0最新版本超详细安装教程

mysql8.0最新版本超详细安装教程 第一步: 百度搜索MySQL 第二步:进入MySQL官方网站后点击DOWNLOADS 第三步:下拉页面找到图中标识 并点击 第四步:点击图中标识 第五步:点击下载第一个 第六步:点击图中标识 第七步:在D盘创建mysql文件夹 第八步:将下载好的mysq压缩包放入到新建…

深度学习:Opencv的blobFromImage是如何工作的

文章目录 1 OpenCV中blobFromImage函数简介2 blobFromImage是如何工作的2.1 介绍2.2 blobFromImage 的工作流程2.3 blobFromImage 和 blobFromImages1 OpenCV中blobFromImage函数简介 如果训练模型时图像的尺寸 与实际使用的图像尺寸不一致,需要对图像尺寸进行变换; blobFr…

第一次使用服务器部署项目

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

HCIA-RS实验-STP和RSTP(2)

接上一篇文章&#xff1b;其他的不多说&#xff0c;新建一个新的配置设备&#xff1b;如果接上一个实验的配置的话&#xff0c;建议先把所有配置删除后再执行&#xff1b;新的拓扑也与上一个实验一致&#xff1b; 目录 创建新配置 配置RSTP 查看stp版本 配置边缘端口 …

如何防止重复下单

一、问题背景 最简单的&#xff1a;DB 事务。如创建订单时&#xff0c;同时往订单表、订单商品表插数据&#xff0c;这些 Insert 须在同一事务执行。 Order 服务调用 Pay 服务&#xff0c;刚好网络超时&#xff0c;然后 Order 服务开始重试机制&#xff0c;于是 Pay 服务对同…

算法基础第一章

算法基础 第一章&#xff1a;基础算法1、排序2、二分查找3、大数据量的加法和减法&#xff08;高精度加减法&#xff09;3.1、加法3.2、减法 4、前缀和4.1、一维前缀和4.2、二维前缀和 5、差分5.1、一维差分5.2、二维差分 6、双指针7、位运算7.1、lowbit的应用 8、离散化9、区间…

基于c与数据库实现的电子词典

1.搭建客户端与服务器&#xff0c;客户端使用多线程方式&#xff0c;主线程跑发送信息给服务器功能&#xff0c;分支线程跑循环接收服务器信息功能 客户端代码&#xff1a; //TCP客户端的搭建 int tcp_kehuduan() {//创建字节流套接字cfd socket(AF_INET,SOCK_STREAM,0);if(c…