遍历

Iterator和ListIterator区别

六月ゝ 毕业季﹏ 提交于 2020-03-08 21:48:51
我们在使用List,Set的时候,为了实现对其数据的遍历,我们经常使用到了Iterator(迭代器)。使用迭代器,你不需要干涉其遍历的过程,只需要每次取出一个你想要的数据进行处理就可以了。 但是在使用的时候也是有不同的。List和Set都有iterator()来取得其迭代器。对List来说,你也可以通过listIterator()取得其迭代器,两种迭代器在有些时候是不能通用的,Iterator和ListIterator主要区别在以下方面 1. ListIterator有add()方法,可以向List中添加对象,而Iterator不能 2. ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。 3. ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。 4. 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。 因为ListIterator的这些功能,可以实现对LinkedList等List数据结构的操作。其实

链表

元气小坏坏 提交于 2020-03-08 21:38:39
一.常见的缓存淘汰策略: 1.先进先出策略FIFO 2.最少使用策略LFU 3.最近最少使用策略LRU 二.链表 (一)链表的定义:链表是物理存储单元上 非连续 的、 非顺序 的存储结构,它由一个个结点,通过指针联系起来的,每个结点包括数据和指针。 (二)链表结构: 1.单链表 通过“指针”将一组零散的内存块串联起来使用。内存块称为结点;记录下个结点地址的指针称为后继指针next;第一个结点为头结点,用来记录链表的基地址;最后一个结点为尾结点,指针指向NULL。 链表的插入、删除操作,只需考虑相邻结点的指针变化,不需要数据搬移,时间复杂度为 O(1) 。 随机访问的时间复杂度为O(n) 。 2.循环链表 是一种特殊的单链表。尾结点的指针指向链表的头结点。 从链尾到链头比较方便。当要处理的数据具有环形结构特点时,适合采用循环链表。例如约瑟夫问题。 3.双向链表 每个结点有两个指针,分别为后继指针next和前驱指针prev。找到前驱结点的时间复杂度为O(1)。 4.双向循环链表 三. 1.删除操作 (1)删除结点中“值等于某个给定值”的结点 从头结点开始一个一个遍历,直到找到值等于给定值的结点,再删除。删除操作时间复杂度为O(1),查找操作时间复杂度为O(n);总时间复杂度为O(n)。 (2)删除给定指针指向的结点 对于单链表来说,要从头结点开始遍历找到给定结点的前驱结点,再删除

DS博客作业01-线性表

白昼怎懂夜的黑 提交于 2020-03-08 19:50:40
0.PTA得分截图 1.1 线性表学习总结 1.线性表的基本概念 线性表是一个具有n个相同特性的有限序列,所有元素都属于同一种数据类型。线性表的逻辑结构简单,便于实现和操作,运用范围广泛。按照存储方式可以分为:顺序表和链表。 2.顺序表 将数据依次存储在连续的整块物理空间中,各结点间的存储单元地址是连续的。 结构体定义 typedef struct node{ ElemType data[MAX]; int length;//保存线性表的长度,或者也可以定义int型变量last用于保存线性表中最后一个数据所在的位置下标。 }Node,*NodeList; 基本操作 顺序表的插入 :实质上就是移动数组的操作,可以从头开始遍历,找到插入的位置后,开始移动数组,或者从末尾开始边移动数组边比较,找到插入的位置后,直接插入; 伪代码: void InserList(NODE & list,int x) { 判断顺序表是否满了,如果满了就return for i=list.length to 0 //从末尾开始一个一个把数据右移,直到找到x的插入位置停止。 if x>list.data[i-1] //找到插入位置,退出循环; break; else list.data[i]=list.data[i-1];//数据进行右移; end if end for list.length++;/

ListIterator源码逐条解析

点点圈 提交于 2020-03-08 18:15:40
一家之言 姑妄言之 絮絮叨叨 不足为训 ListIterator接口注释翻译:    列表的迭代器,它允许程序员以任意方向遍历列表,在迭代期间修改列表,并获取迭代器在列表中的当前位置。ListIterator没有当前元素。它的游标位置总是位于调用previous()返回的元素和调用next()返回的元素之间。长度为n的列表的迭代器有n+1个可能的光标位置,如下面的插入符号(^)所示: Element(0) Element(1) Element(2) Element(3) … Element(n-1) ^ ^ ^ ^ ^    注意,remove和set(object)方法不是根据游标位置定义的。它们被定义为对调用next()或previous()返回的最后一个元素进行操作。    该接口是Java集合框架的成员。 笔者废话:    这个接口的注释说的我也是云里雾里,但是我们大概可以从中略窥一二。首先它说明了我们这个接口是可以从任意方向遍历的。如果你仔细看过这个接口内的方法声明,也就明白了这个“任意方向”的含义。通俗来说,它有了所谓的“ 前驱节点 ”和“ 后继节点 ”。    我相信看到这两个名词你可能就明白了这个接口的本意,它就是一个 双向链表 ,不过我们平常也叫它 双链表 。    其次,它也告诉我们这个接口的游标是不指向元素的,它位于 前驱节点 和 后继节点 之间

Java学习入门-05 -集合浅析

萝らか妹 提交于 2020-03-08 18:06:09
集合数据结构体系框架 Collection接口是List/Set/Queue接口的父接口,其中定义的常用的操作方法有(注意此处笔记不完整,演示代码没有导包): 添加功能  i. boolean add(object obj)添加一个元素  ii. boolean addAll(Collection c)将集合c的全部元素添加到原集合元素后返回true  iii. 添加功能永远返回true 删除功能  i. void clear();移除所有元素  ii. boolean remove(Object o)移除一个元素  iii. boolean removeAll(Collection c)移除一个集合的元素,只要有一个被移除就返回true,改变原集合,删除原集合中和c中相同的元素  iv. 删除功能只有删除成功后才返回true 判断功能  i. boolean contain(object o)判断集合中是否包含指定的元素。  ii. boolean containsAll(Collection c)判断原集合中是否包含指定集合c的所有元素,有则true,  iii. boolean isEmpty()判断集合是否为空 获取功能  i. Iterator iterator()迭代器,集合的专用方式,实现遍历的功能  ii. Object next()获取当前元素,并移动到下一个位置

ES6 之 对象的扩展

岁酱吖の 提交于 2020-03-08 17:52:45
1、Object.is() 判断俩个值是否相等 +0 不等于 -0 NaN 等于自身 console.log(Object.is('foo','foo')); // true console.log(Object.is({},{})); // false console.log(Object.is(+0,-0)); // false console.log(Object.is(NaN,NaN)); // true 2、Object.assign() Object.assign(target, source1, source2) 方法将源对象(source)的所有可枚举的属性(不包括原型上的属性)复制到目标对象上 注意: 如果只有一个参数,Object.assign()会直接返回该参数 如果对象不是对象,则会先转换为对象,然后返回 由于undefined和null无法转换为对象,会报错 如果非对象参数出现在源source对象位置,不会报错 如果在source的原型上定义方法,不会被copy 测试是否能copy不可枚举的属性: let target = { a: 1 } let source1 = { b: 2 } let source2 = { c: 3 } let a = Object.assign(target, source1, source2) // {a: 1, b: 2,

java中为什么要使用迭代器

孤者浪人 提交于 2020-03-08 12:23:00
简而言之,集合的遍历如果用for来进行的话,需要知道集合的内部构造,想遍历数组的时候一样,需要索引有序。但是例如set集合是无序的,使用for遍历不了。这时需要迭代器来遍历,把集合中所有的元素都找出来。 迭代器(Iterator)模式,又叫做游标(Cursor)模式。迭代器提供一种对容器对象中的各个元素进行访问的方法,而又不需暴露该对象的内部细节。 从定义可见,迭代器模式是为容器而生。 很明显,对容器对象的访问必然涉及到遍历算法。你可以将遍历方法写到容器对象中去(内部迭代器);或者根本不去提供什么遍历算法,让使用容器的人自己去实现去吧(外部迭代器)。这两种情况好像都能够解决问题。 然而在前一种情况,容器承受了过多的功能,它不仅要负责自己“容器”内的元素维护(添加、删除等等),而且还要提供遍历自身的接口;而且由于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历。第二种方式倒是省事,却又将容器的内部细节暴露无遗。 而迭代器模式的出现,很好的解决了上面两种情况的弊端。 由于迭代器模式本身的规定比较松散,所以具体实现也就五花八门。我们先来列举下迭代器模式的实现方式。 1.迭代器角色定义了遍历的接口,但是没有规定由谁来控制迭代。在Java collection的应用中,是由客户程序来控制遍历的进程,被称为外部迭代器; 还有一种实现方式便是由迭代器自身来控制迭代,被称为内部迭代器。

三分钟带你快速实现二叉树的递归遍历

一曲冷凌霜 提交于 2020-03-08 12:06:07
写在前面: 上一篇文章中我们聊到了队列—— 漫画趣解——队列 相信很多小伙伴都知道了如何实现队列; 那么这次,时光同样采用漫画形式, 给大家聊一聊什么是二叉树,如何实现二叉树的递归遍历; 思维导图: ​ 什么是树? ​ 树是一种非线性结构,有一个直接前驱,但可能有多个直接后继(1:n); 树的定义具有递归性,树中还有树; 树可以为空,即结节点个数为0; 如图: ​ 若干术语: 根:根节点,没有前驱; 叶子:终端结点,没有后继; 双亲:上层的那个结点,就是直接前驱; 孩子:下层结点的子树,就是直接后继; 结点:树的数据元素;(上图的结点数为11) 结点的度:结点挂接的子树数,有几个直接后继就是几度; 树的度:所有结点度中的最大值,Max{各结点的度},(上图树的度为2); 树的深度(或高度):所有结点中最大的层数,(上图数的深度为3层); 什么是二叉树? ​ 二叉树: ​ 特征:每个结点 最多只有两个子结点 (不存在度大于2的结点); ​ 5种形态: ​ 常见的二叉树有两种重要形态, 满二叉树 和 完全二叉树 ; 满二叉树: 叶子结点全部都在最底层; 除叶子结点外,每个结点都有左右两个子节点; ​ 完全二叉树: 叶子结点全都都在最底的两层; 最后一层只缺少右边的叶子结点,左边一定有叶子结点; 除了最后一层,其它层的结点个数均达到最大值; ​ 二叉树的遍历:

Java入门 - 高级教程 - 02.集合

妖精的绣舞 提交于 2020-03-08 07:42:20
原文地址: http://www.work100.net/training/java-collection.html 更多教程: 光束云 - 免费课程 集合 序号 文内章节 视频 1 概述 - 2 集合接口 - 3 集合实现类(集合类) - 4 集合算法 - 5 如何使用迭代器 - 6 如何使用比较器 - 7 总结 - 请参照如上 章节导航 进行阅读 1.概述 早在 Java 2 中之前,Java 就提供了特设类。比如: Dictionary , Vector , Stack , 和 Properties 这些类用来存储和操作对象组。 虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。 集合框架被设计成要满足以下几个目标: 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性 对一个集合的扩展和适应必须是简单的 为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList , HashSet , 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(

[集合]ListIterator源码解析(7)

微笑、不失礼 提交于 2020-03-08 06:54:13
迭代器可以让开发者遍历一个容器的元素,并且操作元素。 Java有两种原生的迭代器:Iterator和ListIterator, 其中 ListIterator继承自Iterator。 ListIterator比Iterator多了一些方法。例如逆序遍历,遍历时进行set元素到上次操作的元素的位置,add元素等操作。 ListIterator 在该类的说明中,JDK官方也进行了说明,迭代器的游标或者叫索引总是位于调用previous方法返回的元素和调用next方法返回的元素之间。 也就是说,游标不指向元素,而指向元素之间! public interface ListIterator < E > extends Iterator < E > { // Query Operations / 来源: CSDN 作者: 谙忆 链接: https://blog.csdn.net/qq_26525215/article/details/104621235