迭代器

Observable详解

╄→尐↘猪︶ㄣ 提交于 2020-02-05 09:09:03
Observable详解 rxjs angular2 在介绍 Observable 之前,我们要先了解两个设计模式: Observer Pattern - (观察者模式) Iterator Pattern - (迭代器模式) 这两个模式是 Observable 的基础,下面我们先来介绍一下 Observer Pattern。 Observer Pattern 观察者模式定义 观察者模式 是 软件设计模式 的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 — 维基百科 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。 我们可以使用日常生活中,期刊订阅的例子来形象地解释一下上面的概念。期刊订阅包含两个主要的角色:期刊出版方和订阅者,他们之间的关系如下: 期刊出版方 - 负责期刊的出版和发行工作 订阅者 - 只需执行订阅操作,新版的期刊发布后,就会主动收到通知,如果取消订阅,以后就不会再收到通知 在观察者模式中也有两个主要角色:Subject (主题) 和 Observer (观察者)

Iterator迭代器解决[为何禁止在foreach内增删]

我们两清 提交于 2020-02-05 03:24:21
迭代器的应用场景: 1、对集合进行增加删除,禁止使用foreach,循环的动态操作 2、倒序遍历 3、遍历循环 步入正题:为何禁止在foreach内进行增删? 先看一下代码: /** * 正例: * Iterator<String> iterator = list.iterator(); * while (iterator.hasNext()) { * String item = iterator.next(); * if (删除元素的条件) { * iterator.remove(); * } * } * 反例: * List<String> list = new ArrayList<String>(); * list.add("1"); * list.add("2"); * for (String item : list) { * if ("1".equals(item)) { * list.remove(item); * } * } */ 这段代码是,在阿里的开发手册中的一段代码。 我们先看下面场景: /** * 场景一:对集合进行删除,增加、for循环 * 错误:这里会报出数据越界异常, * 因为:remove掉一个元素后,整个长度发生变化,所以发生异常 * 改进:采用forList.size()动态 */ List<String> forList = new

day13_Collection、泛型

旧时模样 提交于 2020-02-05 01:54:38
Collection集合 集合概述 在前面基础班我们已经学习过并使用过集合ArrayList ,那么集合到底是什么呢? 集合: 集合是java中提供的一种容器,可以用来存储多个数据。 集合和数组的区别 数组的长度是固定的。集合的长度是可变的。 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。 学习集合的目标 会使用集合存储数据 会遍历集合,把数据取出来 掌握每种集合的特性 学习集合的方式 学习顶层: 学习顶层的接口/抽象类共性的方法,所有的子类都可以使用 使用底层: 顶层不是抽象类就是接口,无法创建对象使用。我们要使用底层的实现类来创建对象使用。 集合框架 JAVASE提供了满足各种需求的API,在使用这些API前,先了解其继承与接口操作架构,才能了解何时采用哪个类,以及类之间如何彼此合作,从而达到灵活应用。集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection 和双列集合 java.util.Map。Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List 和 java.util.Set 。其中, List 的特点是元素有序、元素可重复丶有索引可以使用普通for循环遍历。

REDIS 字典数据结构

淺唱寂寞╮ 提交于 2020-02-04 20:10:13
对于REDIS来讲 其实就是一个字典结构,key ---->value 就是一个典型的字典结构 【当然 对于vaule来讲的话,有不同的内存组织结构 这是后话】 试想一个这样的存储场景: key:"city" value:"beijing" 如果有若干个这样的键值对,你该怎么去存储它们呢 要保证写入和查询速度非常理想~! 抛开redis不说,如果你想要存储 快速查找的话, Hash算法是最快的,理想的哈希函数可以带来O(1)的查找速度,你都这样想,那么redis也的确采用这种方法来做~! 但是HASH算法有2个致命的弱点:1)填充因子不能太满 2)不好的HASH算法可能会导致一个冲突率非常高。 填充因子不能太满 这个理论上一般为0.5左右 过高 就是哈希槽都被塞满了 ,即使在好的哈希分布算法 也无法避免key冲突。 不好的哈希分布算法 丢到第一个因素来讲, 如果一个不好的哈希分布算法会导致了key分布不均匀,也就是通过哈希函数计算出来的哈希槽都是落在了一个桶里,这样的哈希分布算法是最不理想的,最理想的情况下是 保证每个key都落在不同的哈希槽里【哈希槽>key】 实际存储的哈希存储设计 1)一般来讲,哈希分布函数确定后,可调控的因子就是这个填充因子 如果填充因子大于你卡的某个阈值,那么你就要做哈希结构迁移工作,迁移到一个更大的哈希槽中。而对用同用的这种哈希分布 函数

python 生成器和迭代器

会有一股神秘感。 提交于 2020-02-04 18:35:28
一、迭代器 : 任何实现了__iter__()和__next__()方法的对象都是迭代器。 其中,__iter__返回迭代器自身,__next__返回容器中的下一个元素值。 二、生成器 : 具有 yield 关键字的函数都是生成器。 yield可以理解为特殊的return,该函数不会释放局部变量。 生成器自动实现了__iter__()和__next()__()方法,也就是说生成器也是迭代器。 调用生成器函数,将返回生成器对象,该生成器对象具有迭代器的所有功能。 详情参考 三、自定义迭代器 : class MyNumbersIterator: def __iter__(self): self.a = 1 return self # 返回迭代器自身 def __next__(self): x = self.a self.a += 1 return x myclass = MyNumbersIterator() myiter = iter(myclass) # 通过调用myclass.__iter__()返回迭代器。 print(next(myiter)) # 输出 1 print(next(myiter)) # 输出 2 print(next(myiter)) # 输出 3 print(next(myiter)) # 输出 4 print(next(myiter)) # 输出 5 四

迭代器和生成器

◇◆丶佛笑我妖孽 提交于 2020-02-03 15:48:24
迭代 : 访问集合元素的一种方式. 通常把使用for循环取数的过程称为遍历, 也叫迭代. 可迭代对象 (Iterable): 把可以通过for…in…这类语句迭代读取⼀条数据供我们使⽤的对象称之为可迭代对象. 很多容器都是可迭代对象(iterable), 并不是所有容器都是可以迭代的;但凡可以返回一个迭代器的对象都是可迭代对象 ; 容器: 这个称呼在其他博客上看到的, 了解下; 一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用 in , not in 关键字判断元素是否包含在容器中 . 常见的str, list, set, dict都是容器 可以使用 isinstance() 判断一个对象是否是 Iterable 对象 12345678 from collections import Iterableprint(isinstance([], Iterable)) print(isinstance((), Iterable)) # 判断元组print(isinstance({}, Iterable)) # 判断字典print(isinstance("", Iterable)) # 判断字符串print(isinstance(100, Iterable)) # 判断整数print(isinstance(False, Iterable)) # 判断boolean

map映照容器

爷,独闯天下 提交于 2020-02-03 13:41:04
set和map都是泛型库对二叉树的一个泛化。 一、map的相关原理 map映照容器所处理的元素数据,与数据库中的具有键值的记录非常相似,由一个键值和其它若干个数据(映照数据组成),键值和映照数据之间,可建立一个数学上的映照关系。容器的数据结构是采用红黑树进行管理,元素值不允许重复,所使用的节点元素的比较函数,只对元素的键值进行比较,元素的各个数据项可通过键值检索。 数据构成如图所示: (一个pair对象) 如图所示为map容器的一个元素的数据组成,可通过pair封装成一个结构对象。map容器所要做的,就是将这个pair对象插入到红黑树中,完成一个元素的添加,同时,也要提供一个仅使用键值进行比较的函数对象,将它传递给红黑树。由此,就可以利用红黑树的操作,map元素数据插入到二叉树的正确位置,也可以根据键值进行元素的删除和检索。 map通过内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在std map内部所有的数据都是有序的。 二、map的应用 1、创建 (2)map() 利用默认的less<T>函数对象和内存分配器,创建一个没有任何元素的map对象。 map<char,int,greater<char> >m; //创建空map对象,元素的键值类型为char,元素的映照数据类型为int,键值的比较函数对象为greater<char>. (2

LeetCode 1286. 字母组合迭代器 Iterator for Combination

谁说我不能喝 提交于 2020-02-03 12:39:17
地址 https://leetcode-cn.com/contest/biweekly-contest-15/problems/iterator-for-combination/ 题目描述 请你设计一个迭代器类,包括以下内容: 一个构造函数,输入参数包括:一个 有序且字符唯一 的字符串 characters(该字符串只包含小写英文字母)和一个数字 combinationLength 。 函数 next() ,按 字典序 返回长度为 combinationLength 的下一个字母组合。 函数 hasNext() ,只有存在长度为 combinationLength 的下一个字母组合时,才返回 True;否则,返回 False。 示例: CombinationIterator iterator = new CombinationIterator("abc", 2); // 创建迭代器 iterator iterator.next(); // 返回 "ab" iterator.hasNext(); // 返回 true iterator.next(); // 返回 "ac" iterator.hasNext(); // 返回 true iterator.next(); // 返回 "bc" iterator.hasNext(); // 返回 false 提示: 1 <=

《c++primer》笔记 第3章 字符串、向量和数组

廉价感情. 提交于 2020-02-03 09:52:04
标准库类型 本章重要的两个: string 和 vector ,以及配套的迭代器。 3.1 命名空间的using声明 using声明具有如下的形式: using namespace::name; 一旦声明了上述语句,就可以直接访问命名空间中的名字: #include<iostream> //using声明,当我们使用名字cin时,从命名空间std中获取它 using std::cin; int main() { int i; cin >> i;//正确:cin和std::cin含义相同 cout << i;//错误:没有对应的using声明,必须使用完整的名字 std::cout << i;//正确:显式地从std中使用cout return 0; } 用下面的using可以使用std里面的所有名字: using namespace std; 头文件不应包含using声明 3.2 标准库类型string 初始化string对象的方式 string s1; //默认初始化,si是一个空串 string s2(s1); //s2是s1的副本 string s2=s1; //等价于s2(sl>,s2是s1的副本 string s3("value"); //S3是字面值"value"的副本,除了字面值最后的那个空字符外 string s3="value"; //等价于s3("value")

设计模式-迭代器模式

ⅰ亾dé卋堺 提交于 2020-02-03 04:50:18
迭代器(Iterator)模式的定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。该模式在现代c++中已经过时。伪代码如下: #include <QCoreApplication> #include <iostream> using namespace std; template <typename T> class Iterator{ public: virtual void first(){} virtual void next(){} virtual bool isDone()const{return true;} virtual T& current(){return value;} private: int value; }; template <typename T> class MyCollection{ public: Iterator<T>GetIterator(){ return value; } private: Iterator<T> value; }; template <typename T> class CollectionIterator:public Iterator<T>{ public: CollectionIterator(const MyCollection<T>& c):mc(c){} void first(