迭代器

40个Java集合面试问题和答案

一曲冷凌霜 提交于 2019-12-07 05:08:14
1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下: (1)使用核心集合类降低开发成本,而非实现我们自己的集合类。 (2)随着使用经过严格测试的集合框架类,代码质量会得到提高。 (3)通过使用JDK附带的集合类,可以降低代码维护成本。 (4)复用性和可操作性。 2.集合框架中的泛型有什么优点? Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。泛型也使得代码整洁,我们不需要使用显式转换和instanceOf操作符。它也给运行时带来好处,因为不会产生类型检查的字节码指令。 3.Java集合框架的基础接口有哪些? Collection为集合层级的根接口 。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。

Leetcode173. 二叉搜索树迭代器

强颜欢笑 提交于 2019-12-06 20:00:29
空间复杂度O(h)而不是O(n),因此不能直接在初始化函数中做中序遍历将结果存储到数组中。 next()和hasNext()时间复杂度为O(1) 首先本题很容易想到用二叉树的中序遍历去解决,外加注意点1.我们得到思路:仅仅将中序遍历最小值之前的节点压入栈中,当next时我们将栈顶元素取出即为最小值返回,当然在此之前需要将下一个最小值找到,并将路径上的所有节点压入栈中以供使用,查看是否迭代到头只需判断栈是否为空即可,如下: class BSTIterator { private: stack<TreeNode*>ss; public: BSTIterator(TreeNode* root) { while(root) { while (root) { ss.push(root); root=root->left; } } } /** @return the next smallest number */ int next() { TreeNode* cur=ss.top(); int num=cur->val; ss.pop(); cur=cur->right; while (cur) { ss.push(cur); cur=cur->left; } return num; } /** @return whether we have a next smallest number */

迭代器-斐波那契数列

你离开我真会死。 提交于 2019-12-06 14:58:06
使用迭代器实现斐波那契数列 1 class Finacci(object): 2 def __init__(self,num): 3 self.num = num 4 self.a = 1 5 self.b = 1 6 self.current_index=0 7 def __iter__(self): #定义迭代器 8 return self 9 def __next__(self): 10 if self.current_index<self.num: 11 data = self.a 12 self.a=self.b 13 self.b=self.a+self.b 14 self.current_index+=1 15 return data 16 else: 17 raise StopIteration 18 19 if __name__ == '__main__': 20 fib = Finacci(5) 21 # val = next(fib) 22 for value in fib: 23 print(value) 来源: https://www.cnblogs.com/liuxjie/p/11991363.html

new

偶尔善良 提交于 2019-12-06 12:05:06
目录 迭代器 迭代器介绍 创建一个迭代器 如何判断一个对象是否可以迭代 迭代器的应用场景(斐波那契迭代器实现) 生成器 生成器介绍 创建生成器方法1 创建生成器方法2 总结 迭代器 迭代器介绍 迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法: iter() 和 next() 。 字符串,列表或元组对象都可用于创建迭代器: 创建一个迭代器 class Demo(object): def __iter__(self): # 需要返回一个迭代器,否则无法进行for...in循环 # MyIterator 要重写 __next__ 方法以后,它就是一个迭代器 it = MyIterator() return it class MyIterator(object): count = 0 def __next__(self): if self.count < 5: self.count += 1 return 'hello world' else: raise StopIteration # 抛出一个StopIteration异常 d = Demo() # print(isinstance(d, Iterable)) for

从王者荣耀看设计模式(十二.迭代器模式)

和自甴很熟 提交于 2019-12-06 11:42:56
从王者荣耀看设计模式(迭代器模式) 一.简介 王者荣耀是一款支持多人协同竞技的游戏,支持QQ/微信登陆。在王者荣耀中,可以通过游戏列表查看QQ/微信好友的状态,以便判断是否邀请好友加入游戏 二.迭代器模式 迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor).迭代器模式是一种对象行为型模式。 迭代器模式的使用场景 访问一个聚合对象的内容而无须暴露它的内部表示。将聚合对象的访问与内部数据的存储分离,使得访问聚合对象时无须了解其内部实现细节 需要为聚合对象提供多种遍历方式 为遍历不同的聚合结构提供一个统一的接口。当需要扩展聚合结构或者给聚合结构增加新的遍历方式时可以使用迭代器模式,它提供了聚合结构和迭代器的抽象定义 迭代器模式涉及的设计原则有: 为了交互对象之间的松耦合而努力 一个类应该只有一个引起变化的原因 针对接口编程,而不是针对实现编程 迭代器模式的通用类图 迭代器模式所涉及的角色有: ● Iterator(抽象迭代器类) :抽象迭代器定义了访问和遍历元素的接口,一般声明以下方法:用于获取第一元素的first(),用于访问下一个元素的next(),用于判断是否还有下一个元素的hasNext(),用于获取当前元素的currentItem(),在其子类中将实现这些方法 ●

DBus如何传送和接收数据

不打扰是莪最后的温柔 提交于 2019-12-06 08:08:25
DBus是进程间通信的工具。网上的资料不太多,大都又是基于GLib或python的。在windows下如果要用纯c/c++语言,似乎只能用原始的DBus库来编写程序。倘若不亲自写写,还真不知道到底是怎样的。 DBus的数据都要绑定在消息上: 消息: DBusMessage 数据: DBusMessageIter 从数据结构的命名上看,与其称之为消息的数据,不如称为消息数据的迭代器。 事实上其数据的操作过程,就是个迭代过程。 I 传输单独一个变量 如bool类型,有: DBusMessage *msg; // DBus消息 DBusMessageIter datatoSentIter; // DBus数据迭代器 dbus_bool_t singleData = true; // DBus的内建bool型 // 每条语句都需要返回值bool判断是否成功,为方便清晰略去 dbus_message_iter_init_append(msg, &datatoSentIter); // 将迭代器绑定至消息 dbus_message_iter_append_basic(&datatoSentIter, DBUS_TYPE_BOOLEAN, &singleData); // TODO: 向连接发送并flush 以上是发送,接收此单个bool数据也很简单: DBusMessageIter

使用Java迭代器实现Python中的range

╄→гoц情女王★ 提交于 2019-12-06 07:03:38
如果要想迭代一个类的对象,那么该类必须实现 Iterable 接口,然后通过 iterator 方法返回一个 Iterator 实例。 Range 类实现了Python中的range的所有用法,如:range(10),range(5, 10),range(10, 0, -1),range(0, 10, 2) 使用实例: for (int x : new Range(10, 0, -1)) { System.out.println(x); } /* 输出: 10 9 8 7 6 5 4 3 2 1 */    代码: class Range implements Iterable<Integer> { private final int start; private final int end; private final int step; public Range(int end) { this(0, end, 1); } public Range(int start, int end) { this(start, end, 1); } public Range(int start, int end, int step) { this.start = start; this.end = end; this.step = step; } @Override public

c++——模板、泛型

a 夏天 提交于 2019-12-06 06:53:32
容器 容器(container)用于存放数据的类模板 容器都是类模板。它们实例化后就成为容器类。用容器类定义的对象称为容器对象 例如, vector<int> 是一个容器类的名字, vector<int> a; 就定义了一个容器对象 a 容器分为顺序容器和关联容器 顺序容器有以下三种:可变长动态数组 vector、双端队列 deque、双向链表 list 它们之所以被称为顺序容器,是因为元素在容器中的位置同元素的值无关,即容器不是排序的 关联容器有以下四种:set、multiset、map、multimap 关联容器内的元素是排序的,因此插入元素时不能指定位置 默认情况下,关联容器中的元素是从小到大排序(或按关键字从小到大排序)的 数组是一种类似于vector的数据结构,但数组大小确定,不能随意向其中增加元素 迭代器 要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行 迭代器是一个变量,相当于容器和操纵容器的算法之间的中介 迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和 指针 类似 通过迭代器可以读取它指向的元素, *迭代器名 就表示迭代器指向的元素。通过非常量迭代器还能修改其指向的元素 模板 函数模板:重载的进一步抽象,只需定义一个函数体即可用于所有类型 在C++中,数据的类型也可以通过参数来传递

44444

随声附和 提交于 2019-12-06 06:27:02
集合框架 一、Collection集合 集合:Java中提供的一种容器,用来存储多个数据。Collection是单列集合类的根接口。 集合和数组的区别:1.数组的长度是固定。集合的长度是可变的。2.数组中存储的是同一类型元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以 不一致。 Collection常用功能 public boolean add(E e) : 把给定的对象添加到当前集合中 。public void clear() :清空集合中所有的元素。public boolean remove(E e) : 把给定的对象在当前集合中删除。public boolean contains(E e) : 判断当前集合中是否包含给定的对象。public boolean isEmpty() : 判断当前集合是否为空。public int size() : 返回集合中元素的个数。public Object[] toArray() : 把集合中的元素,存储到数组中。 Iterator迭代器 原理: 首先通过调用t集合的iterator()方法获得迭代器对象,然后使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素。 ​ Iterator迭代器对象在遍历集合时

STL 迭代器适配器(iterator adapter)

倖福魔咒の 提交于 2019-12-06 05:40:22
iterator adapter graph LR iterator --- reverse_iterator iterator --- Insert_iterator iterator --- iostream_iterator Insert_iterator --- back_insert_iterator Insert_iterator --- front_insert_iterator Insert_iterator --- insert_iterator 插入迭代器:将一般迭代器的赋值操作转变为插入操作。 insert iterator 当用户对inserter iterator作赋值操作时,就在inserter iterator类中定义的operator()中调用底层容器的插入操作(push_back,push_front,insert,etc.). 以back_inserter插入迭代适配器为例:(front_inserter和inserter与该类相类似) template <class _Container> inline back_insert_iterator<_Container> back_inserter(_Container& __x) { return back_insert_iterator<_Container>(__x); }