前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >迭代器模式 迭代器模式

迭代器模式 迭代器模式

作者头像
mingmingcome
发布于 2021-12-09 09:08:07
发布于 2021-12-09 09:08:07
79200
代码可运行
举报
运行总次数:0
代码可运行

2021年11月27日18:24:29

迭代器模式

定义
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Provide a way to access the elements of an aggregate object sequentially without
exposing its underlying representation. ——《Design Patterns: Elements of Reusable Object-Oriented Software》

提供一种顺序访问集合的元素而不暴露其底层表示的方法。 ——《设计模式:可复用面向对象软件的基础》

迭代器模式是一种行为型模式。

明明讲

迭代器模式就是提供一种遍历的方法,这种方法有两个特点:一是按你想要的方式访问到你想访问的元素,二是不暴露底层是什么存的,怎么存的。

在开发过程中,我们使用类库提供给我们的集合,遍历集合中的元素,使用的就是迭代器。一般情况下,单单作为使用者,我们是不会去关注这些集合底层结构是什么,只需要拿到我们需要的数据,进行业务逻辑的处理就可以了。但是呢,作为一个优秀的开发者,当然要深入了解各种集合的数据结构及操作的。当然啦,我们是不会说我们是为了面试才去了解的啦。(此处应该有表情)

常见用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    List<String> list = new ArrayList<>();
    list.add("ming");
    list.add("ming");
    list.add("come");
    for(String s : list) {
        System.out.println(s);
    }

上面代码中的for循环遍历列表中的数据,Java编译器会将这段代码变成使用ArrayList中的迭代器去遍历数据。编译之后再反编译,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    List<String> list = new ArrayList();
    list.add("ming");
    list.add("ming");
    list.add("come");
    Iterator var1 = list.iterator();

    while(var1.hasNext()) {
        String s = (String)var1.next();
        System.out.println(s);
    }
图示

迭代器模式结构图:

角色

抽象迭代器角色(Iterator):

  • 定义一个接口,用于访问和遍历元素,它的方法一般有:first、next、hasNext等。

具体迭代器角色(ConcreteIterator):

  • 实现【抽象迭代器角色】定义的执行操作
  • 记录集合迭代时的当前位置,如图中的currentItem()方法
  • 当客户端控制迭代,迭代器被称作外部迭代器;当迭代器控制迭代,迭代器是内部迭代器。(When the client controls the iteration, the iterator is called an external iterator, and when the iterator controls it, the iterator is aninternal iterator.)
  • Java类库中AbstractList、ArrayList、HashMap中都有具体迭代器

抽象集合角色(Aggregate):

  • 定义了一个接口,用于创建迭代器对象

具体集合角色(ConcreteAggregate):

  • 实现【抽象集合角色】,实现创建迭代器对象方法,返回一个迭代器实例
代码示例

家有小女,名为晓月,一岁有余,嘤嘤学语。

除夕佳节,给家人拜年,爷爷奶奶,爸爸妈妈,叔叔婶婶,还有晓月自己,新年快乐。

类图:

抽象迭代器角色:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface NameIterator {
    String next();
    boolean hastNext();
}
抽象集合角色:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface FamilyAggregate {
    NameIterator createIterator();
    boolean addFamily(int generation, String name);
}
具体集合角色和具体迭代器角色:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 具体集合类
public class FamilyAggregateImpl implements FamilyAggregate {

    private int generation;

    private List<String>[] generations;

    public FamilyAggregateImpl(int generation) {
        this.generation = generation;
        this.generations = initFamily(generation);
    }

    private List<String>[] initFamily(int generation) {
        List<String>[] name = new ArrayList[generation];
        for (int i = 0; i < generation; i++) {
            name[i] = new ArrayList<>();
        }
        return name;
    }

    public boolean addFamily(int generation, String name) {
        return generations[generation - 1].add(name);
    }

    @Override
    public NameIterator createIterator() {
        return new NameIteratorImpl();
    }

    // 具体迭代器
    private class NameIteratorImpl implements NameIterator {

        int currentGeneration;

        int cursor;

        NameIteratorImpl() {
            this.currentGeneration = FamilyAggregateImpl.this.generation;
        }

        @Override
        public String next() {
            int i = cursor;
            List<String>[] generations = FamilyAggregateImpl.this.generations;
            if (currentGeneration == 1 && cursor == generations.length) {
                System.out.println("无剩余可遍历");
            }
            String name = generations[currentGeneration - 1].get(i);
            cursor = i + 1;
            if (cursor == generations[currentGeneration - 1].size()) {
                currentGeneration--;
                cursor = 0;
            }
            return name;
        }

        @Override
        public boolean hastNext() {
            return currentGeneration != 0;
        }
    }

}
客户端
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Client {
    public static void main(String[] args) {
        FamilyAggregate family = new FamilyAggregateImpl(3);

        family.addFamily(1, "晓月");
        family.addFamily(2, "爸爸");
        family.addFamily(2, "妈妈");
        family.addFamily(2, "叔叔");
        family.addFamily(2, "婶婶");
        family.addFamily(3, "爷爷");
        family.addFamily(3, "奶奶 ");

        NameIterator iterator = family.createIterator();
        while (iterator.hastNext()) {
            String name = iterator.next();
            System.out.println(name);
        }

    }
}

结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
爷爷
奶奶 
爸爸
妈妈
叔叔
婶婶
晓月
使用场景
  • 1、访问一个聚合对象的内容而无须暴露它的内部表示。
  • 2、可以为聚合对象提供多种遍历方式,比如顺序、逆序等。
  • 3、为遍历不同的聚合结构提供一个统一的接口,比如访问下一个元素的方法是next。
优点
  • 1、它支持以不同的方式遍历一个聚合对象。
  • 2、迭代器简化了聚合类。
  • 3、在同一个聚合上可以有多个遍历。
  • 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点
  • 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
总结

迭代器模式应该是最常见的设计模式了,可以说Java程序员只要开发,都要使用它。

迭代器模式是一种行为型设计模式,它为集合提供了一个遍历元素的方式,又不会暴露它的内部表示。

2021年12月7日01:47:38

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
lstm怎么预测长时间序列_时间序列预测代码
LSTM模型的一个常见用途是对长时间序列数据进行学习预测,例如得到了某商品前一年的日销量数据,我们可以用LSTM模型来预测未来一段时间内该商品的销量。但对于不熟悉神经网络或者对没有了解过RNN模型的人来说,想要看懂LSTM模型的原理是非常困难的,但有些时候我们不得不快速上手搭建一个LSTM模型来完成预测任务。下面我将对一个真实的时间序列数据集进行LSTM模型的搭建,不加入很多复杂的功能,快速的完成数据预测功能。
全栈程序员站长
2022/09/30
3.1K1
lstm怎么预测长时间序列_时间序列预测代码
如何使用带有Dropout的LSTM网络进行时间序列预测
长短期记忆模型(LSTM)是一类典型的递归神经网络,它能够学习观察所得的序列。
风飘叶扬
2018/02/05
21.2K1
用Python的长短期记忆神经网络进行时间序列预测
长短期记忆递归神经网络具有学习长的观察序列的潜力。
QiqiHe
2018/02/08
9.7K2
用Python的长短期记忆神经网络进行时间序列预测
基于长短期记忆神经网络LSTM的多步长时间序列预测
长短时记忆网络(LSTM)是一种能够学习和预测长序列的递归神经网络。LSTMs除了学习长序列外,还可以学习一次多步预测,这对于时间序列的预测非常有用。LSTMs的一个困难在于,它们可能难以配置,而且需要大量的准备工作才能获得适合学习的格式的数据。
代码医生工作室
2020/06/16
6.9K0
基于长短期记忆神经网络LSTM的多步长时间序列预测
在Keras中如何对超参数进行调优?
由于没有一个成熟的理论来解释神经网络,所以配置神经网络通常是困难的,经常被同学们调侃为“炼丹”。
花落花飞去
2018/02/05
17.2K2
在Keras中如何对超参数进行调优?
Keras中带LSTM的多变量时间序列预测
像长短期记忆(Long Short-Term Memory ) LSTM 递归神经网络这样的神经网络几乎可以完美地模拟多个输入变量的问题。
QiqiHe
2018/02/09
46.7K8
Keras中带LSTM的多变量时间序列预测
深入探讨Python中的时间序列分析与预测技术
时间序列分析是数据科学中的重要领域,它涵盖了从数据收集到模型构建和预测的整个过程。Python作为一种强大的编程语言,在时间序列分析和预测方面有着丰富的工具和库。本文将介绍Python中常用的时间序列分析与预测技术,并通过代码实例演示其应用。
一键难忘
2024/08/15
2240
时间序列基于监督学习的LSTM模型为什么可以预测股票走势(附完整代码)
疫情期间,在家学习Python,调通了基于监督学习的LSTM神经网络预测模型代码,在一般代码的基础上,做了单步和多步通用版的改进。调通的代码附后,供各位大咖指正。
用户7017302
2020/03/01
4K0
Keras中的多变量时间序列预测-LSTMs
神经网络诸如长短期记忆(LSTM)递归神经网络,几乎可以无缝地对多变量输入问题进行建模。
派大星的数据屋
2022/04/02
3.4K0
Keras中的多变量时间序列预测-LSTMs
时间序列模型(ARIMA和ARMA)完整步骤详述「建议收藏」
我于2019年发布此篇文章至今收获了许多人的指点,当时的代码的确晦涩难懂,近期有空,将代码重新整理了一遍,重新发送至此。希望能够帮助大家更好地理解。
全栈程序员站长
2022/08/25
7.8K0
时间序列模型(ARIMA和ARMA)完整步骤详述「建议收藏」
Python时间序列预测案例研究:巴尔的摩年度用水量
时间序列预测是一个过程,获得良好预测的唯一方法就是练习这个过程。
花落花飞去
2018/02/06
7.3K0
darts 时序预测入门
darts是一个强大而易用的Python时间序列建模工具包。在github上目前拥有超过7k颗stars。
lyhue1991
2024/06/14
3350
darts 时序预测入门
基于SARIMA、XGBoost和CNN-LSTM的时间序列预测对比
本文将讨论通过使用假设测试、特征工程、时间序列建模方法等从数据集中获得有形价值的技术。我还将解决不同时间序列模型的数据泄漏和数据准备等问题,并且对常见的三种时间序列预测进行对比测试。
deephub
2023/02/01
1.4K0
用python做时间序列预测九:ARIMA模型简介
c是常数项,εt是随机误差项。 对于一个AR(1)模型而言: 当 ϕ1=0 时,yt 相当于白噪声; 当 ϕ1=1 并且 c=0 时,yt 相当于随机游走模型; 当 ϕ1=1 并且 c≠0 时,yt 相当于带漂移的随机游走模型; 当 ϕ1<0 时,yt 倾向于在正负值之间上下浮动。
AI粉嫩特工队
2020/06/17
32.3K1
基于深度学习模型的空气污染时序预测
Blog: http://yishuihancheng.blog.csdn.net
郭好奇同学
2022/06/07
2.2K0
基于深度学习模型的空气污染时序预测
使用LSTM模型预测多特征变量的时间序列
使用LSTM模型预测多特征变量的时间序列,能够帮助我们在各种实际应用中进行更准确的预测。这些应用包括金融市场预测、气象预报、能源消耗预测等。
Python编程爱好者
2024/07/12
1.5K0
使用LSTM模型预测多特征变量的时间序列
时间序列预测(二)基于LSTM的销售额预测
O:小H,Prophet只根据时间趋势去预测,会不会不太准啊 小H:你这了解的还挺全面,确实,销售额虽然很大程度依赖于时间趋势,但也会和其他因素有关。如果忽略这些因素可能造成预测结果不够准确 小O:那有没有什么办法把这些因素也加进去呢? 小H:那尝试下LSTM吧~
HsuHeinrich
2023/05/25
1.4K0
时间序列预测(二)基于LSTM的销售额预测
Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测|附代码数据
根据频率,时间序列可以是每年(例如:年度预算),每季度(例如:支出),每周(例如:销售数量),每天(例如天气),每小时(例如:股票价格),分钟(例如:来电提示中的呼入电话),甚至是几秒钟(例如:网络流量)。
拓端
2023/07/17
1K0
第14节:lstm原理及numpy
文章目录 lstm原理 rnn lstm实例 lstm原理 文本相关。主要应用于自然语言处理(NLP)、对话系统、情感分析、机器翻译等等领域,Google翻译用的就是一个7-8层的LSTM模型。 时序相关:就是时间序列的预测,诸如预测天气/温度/. 为何全连接层和卷积神经网络无法处理序列问题,因为缺乏记忆模块,无法记忆之前输入的内容. rnn - 简单的rnn。输入是2维的(timesteps, input_features). 这里的loop就是在timesteps上的loop:每一个时刻t,RNN
AI拉呱
2022/04/13
4340
第14节:lstm原理及numpy
Forecast at energy(Smart meters in London)
数据源: https://www.kaggle.com/jeanmidev/smart-meters-in-london
李玺
2021/11/22
5790
Forecast at energy(Smart meters in London)
推荐阅读
相关推荐
lstm怎么预测长时间序列_时间序列预测代码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档