遍历

Iterator(迭代器)

◇◆丶佛笑我妖孽 提交于 2019-12-16 07:18:43
Iterator(迭代器) 行为型 对象 1 Intent_意图 2 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示 Motivation_动机 3 用同一种方法遍历包含不同类型数据的整合对象 Applicability_适用性 4 遍历 一个聚合对象 Structure_结构 5 Participants_参与者 6 Iterator(抽象迭代器) 定义访问和遍历聚合元素的接口 ConcreteIterator(具体迭代器) 实现抽象迭代器接口中所定义的方法 Aggregate(抽象聚合) 定义创建迭代器对象的接口 ConcreteAggregate(具体聚合) 实现抽象聚合类接口,返回一个具体迭代器的实例 Client(客户) 持有对聚集及其迭代对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除 Collaborations_协作 7 Iterator定义访问和遍历聚合元素的接口 ->通常包含hasNext()、first()、next()等方法 ConcreteIterator实现Iterator中所定义的方法,完成对聚合对象的遍历,并记录遍历过程中游标的位置 Aggregate定义操作聚合对象以及创建迭代器对象的接口 ->聚合对象的操作包括存储、添加、删除等 ConcreteAggregate实现Aggregate的接口

java实现遍历一个文件夹

梦想的初衷 提交于 2019-12-16 07:14:48
package com . youjiue . woeks ; import java . io . File ; /** * * @author 丢了风筝的线 * @see 遍历一个文件夹,输出这个文件夹下所有的文件 */ public class Work02 { public static void main ( String [ ] args ) { File file = new File ( "D:/新建文件夹/20191014优就业/web/web_day03" ) ; traversalFile ( file ) ; } // 遍历文件夹,拿到每个文件 public static void traversalFile ( File file ) { if ( ! file . exists ( ) ) { System . out . println ( "文件或文件夹不存在" ) ; return ; } else { if ( ! file . isDirectory ( ) ) { System . out . println ( file ) ; } else { File [ ] files = file . listFiles ( ) ; if ( files . length == 0 ) { System . out . println ( file

数据结构与算法——day02

会有一股神秘感。 提交于 2019-12-16 04:54:55
前言 今天大致了解了链表的基本概念,然后着重学习了单链表的增删改查、统计单链表的有效节点数和按序查找单链表的节点。由于时间原因,还要复习考试,并且这次学习的也是比较多啦,所以剩余的单链表的三个方法就明天再学之后再加上一个补充。综合来看这次的学习代码比较多,知识概念比较少。OK,切入正题! 何为链表? 链表是 有序的列表 在内存中存储如下: 链表是以 节点 的方式来存储,是 链式存储 每个节点包含data 域, next 域:指向下一个节点. 两域 链表的各个节点 不一定是连续存储. 链表分 带头节点的链表 和 没有头节点的链表 ,根据实际的需求来确 文字很抽象? 来张单链表的存储图瞅瞅(原来我以为一直很好奇链式的代码要怎么写,用了java才知道是用类定义的,就有一种恍然大悟的感觉) 简单的概念介绍之后就是应用实例的代码编写,好,进入正文! 正文 应用实例是对于带头结点的英雄节点的单链表进行如下操作: 增加(分两种,一种是简单的来一个添加一个,第二种就是按no编号按顺序的添加) 删除(简单的删除节点操作) 修改(根据英雄的no修改英雄的信息) 查询(直接显示所有的英雄信息) 统计单链表中所有有效节点的个数(不包括头节点) 按index查找倒数第k个节点 最开始我是很好奇,为什么要用单链表实现?(不知道你们有没有这样的好奇) 其实单链表实现的方式不需要连接数据库等进行操作

剑指offer-22 从上往下打印二叉树 -- Java实现

倾然丶 夕夏残阳落幕 提交于 2019-12-16 02:26:50
题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 分析 思路一: 这种打印方式需要遍历整棵树,而遍历的顺序并非前序,中序,后续。而是要求按层的顺序,从左往右的优先顺序打印。 举例来说,打印了根结点之后,我们应存储其左右子结点以供打印,而当要打印左子结点时,应将左子节点的子结点按从左至右的顺序存储起来。而此时存储的有根结点的右子结点和左子结点的子结点。后续以此类推。可以看出,我们 存储临时的以供打印的子结点的这种数据结构应为队列(Quene) 。 总结: 广度优先遍历即上述按层的顺序来遍历树,首先应将第一个结点存入队列。接下来每次从队列的头部取一个结点出来,遍历这个节点所能到达的节点(即子节点)并将其存入队列。重复直至遍历完。 时间复杂度 :o(N) 空间复杂度 :o(N) 代码: import java . util . ArrayList ; /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ import java . util . LinkedList ; import java . util . Queue ; public class

Shell数组定义和遍历

我们两清 提交于 2019-12-16 01:35:41
数组定义: 1 arr = ( 1 2 3 4 5 ) # 注意是用空格分开,不是逗号!! 数组定义法2: 1 2 3 4 array array [ 0 ] = "a" array [ 1 ] = "b" array [ 2 ] = "c" 获取数组的length(数组中有几个元素): 1 $ { #array[@]} 遍历(For循环法): 1 2 3 4 for var in $ { arr [ @ ] } ; do echo $ var done 遍历(带数组下标): 1 2 3 for i in "${!arr[@]}" ; do printf "%s\t%s\n" "$i" "${arr[$i]}" done 遍历(While循环法): 1 2 3 4 5 6 i = 0 while [ $ i - lt $ { #array[@] } ] do echo $ { array [ $ i ] } let i ++ done 向函数传递数组: 由于Shell对数组的支持并不好,所以这是一个比较麻烦的问题。 翻看了很多StackOverFlow的帖子,除了全局变量外,无完美解法。 这里提供一个变通的思路,我们可以在调用函数前,将数组转化为字符串。 在函数中,读取字符串,并且分为数组,达到目的。 1 2 3 4 5 6 7 8 9 10 11 12 fun ( ) {

MySQL:Left Join 避坑指南

那年仲夏 提交于 2019-12-16 01:02:55
现象 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论、商城里一个货物有多少评论、一条评论有多少个赞等等。但是由于对join、on、where等关键字的不熟悉,有时候会导致查询结果与预期不符,所以今天我就来总结一下,一起避坑。 这里我先给出一个场景,并抛出两个问题,如果你都能答对那这篇文章就不用看了。 假设有一个班级管理应用,有一个表classes,存了所有的班级;有一个表students,存了所有的学生,具体数据如下(感谢廖雪峰的在线SQL): SELECT * FROM classes; SELECT * FROM students; 那么现在有两个需求: *** 找出每个班级的名称及其对应的女同学数量 *** 找出一班的同学总数 对于需求1,大多数人不假思索就能想出如下两种sql写法,请问哪种是对的? SELECT c.name, count(s.name) as num FROM classes c left join students s on s.class_id = c.id and s.gender = ‘F’ group by c.name 或者 SELECT c.name, count(s.name) as num FROM classes c left join students s on s.class_id =

GandCrab5.0.9样本详细分析

女生的网名这么多〃 提交于 2019-12-16 00:10:51
☣前言:  WannaCry利用永恒之蓝漏洞爆发以后,病毒安全的前沿对抗最频繁种类则是勒索病毒了,17年初或者更早就有人捕获了GandCrab家族的勒索病毒,直到18年已经更新迭代到了5.0版本,18年进入尾声的时候,安全研究人员发现了GandCrab勒索病毒的V5.1最新版变种。   对于勒索个人看法:当第一次听说勒索病毒的时候,就感觉一定是无法抗拒的利益驱动,才会让某一群人去迭代、维护、研发勒索病毒。这道理就像开了一家公司一样,能把病毒走向全世界,已经是很成功了,看似简单,其实背后的关联复杂。除了加密算法的复杂程度之外,勒索的潜伏与隐蔽(字符串混淆加密)也是比较到位。  其实不管怎样,那些API还是那些API,即使自己实现相仿得函数,时间足够也能从函数功能与汇编,加以逻辑去推理过程,从而实现、还原。 ✃ 1、预热(收集系统信息、提权、注册表操作、兼容匹配、加密解密关键字符串等) 2、枚举扫描(网络共享、资源枚举,遍历扫描文件) 3、加密文件(过滤、匹配的文件以不同方式进行加密) 4、收尾工作(发送勒索信息、删除病毒、销毁进程等)  基本所分析的病毒大多数都会这样干,因为他既要保证你系统的稳定性,也要保证自己的安全与功能的实现,这样才能勒索到钱......                                 ps:文章最后附思维导图 ✃ ☛预热分析: 1、线上分析:

list中含有map的排序问题

牧云@^-^@ 提交于 2019-12-15 22:42:34
Map的种类 在Java中,Map的主要作用是存储键值对。由于是根据键得到值,所以不允许键重复。它主要有如下几个类别: HashMap 最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。Hashtable与HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。 LinkedHashMap 保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关

ES6知识点-Iterator遍历器

℡╲_俬逩灬. 提交于 2019-12-15 20:41:30
4.1Iterator遍历器 4.1.1Iterator(遍历器)的概念 遍历器(Iterator) 是一种接口,为了各种 不同的数据结构 提供 统一的访问机制 。 任何数据结构 只要部署Iterator接口 ,就可以 完成遍历操作 (即依次处理该数据结构的所有成员)。 Iterator的 作用 有三个: 一是为各种数据结构,提供 一个统一的、简便的访问接口 ; 二是使得数据结构的成员能够 按某种次序排列 ; 三是ES6创造了一种 新的遍历命令for...of循环 。 Iterator的 遍历过程 如下: 创建一个 指针对象 , 指向 当前数据结构的 起始位置 。也就是说, 遍历器对象 本质上,就 是一个指针对象 。 第一次 调用指针对象的 next方法 ,可以将指针指向数据结构的 第一个成员 。 第二次调用 指针对象的 next方法 ,指针就指向数据结构的第 二个成员 。 不断调用 指针对象的next方法,直到它指向数据结构的 结束位置 。 4.1.2数据结构的默认Iterator接口 Iterator 接口的目的 ,就是为所有数据结构提供了一种 统一的访问机制,即for...of循环 。 一种数据结构 只要部署了Iterator接口 ,我们就称这种数据结构是 ”可遍历的“(iterable) 。 ES6规定,默认的Iterator接口部署在 数据结构的Symbol

js循环遍历数组

懵懂的女人 提交于 2019-12-15 03:06:51
1.for循环 使用临时变量,将长度缓存起来,避免重复获取数组长度,当数组较大时优化效果才会比较明显。 1 2 3 for (j = 0,len=arr.length; j < len; j++) { } 2.foreach循环 遍历数组中的每一项,没有返回值,对原数组没有影响,不支持IE 1 2 3 4 5 6 //1 没有返回值 arr.forEach((item,index,array)=>{ //执行代码 }) //参数:value数组中的当前项, index当前项的索引, array原始数组; //数组中有几项,那么传递进去的匿名回调函数就需要执行几次; 3.map循环 有返回值,可以return出来 map的回调函数中支持return返回值;return的是啥,相当于把数组中的这一项变为啥(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了); 1 2 3 4 5 6 7 arr.map( function (value,index,array){    //do something    return XXX }) 1 2 3 4 5 6 var ary = [12,23,24,42,1]; var res = ary.map( function (item,index,ary ) { return item*10; })