遍历

ES6迭代器和生成器

心不动则不痛 提交于 2019-12-03 20:48:04
一、迭代器 JavaScript 原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和Set。这样就需要一种统一的接口机制,来处理所有不同的数据结构。遍历器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。 任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员) 。 1.Iterator的作用: 为各种数据结构,提供一个统一的、简便的访问接口; 使得数据结构的成员能够按某种次序排列 ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费。 2.原生具备iterator接口的数据(可用for of遍历) Array set容器 map容器 String 函数的 arguments 对象 NodeList 对象 let arr3 = [1, 2, 'kobe', true]; for(let i of arr3){ console.log(i); // 1 2 kobe true } let str = 'abcd'; for(let item of str){ console.log(item); // a b c d } function fun() { for (let i of arguments) {

迭代器与生成器

隐身守侯 提交于 2019-12-03 20:36:08
一、迭代器 迭代器可以理解为一种特殊的游标,是对循环遍历等一系列操作组成的一种抽象描述。而迭代器协议是程序的一种绑定关系,实现了该协议的对象称为可迭代对象。迭代器协议强调对象必须提供一个next或__next__()方法,并且执行该方法只有两种决策,要么返回迭代中的下一项,要么者引起一个StopIteration异常,以终止迭代。for循环的本质是循环所有对象,使用的一定是迭代器协议生成对象。因此for循环可以遍历所有的可迭代对象(字符串、列表、元组、字典、文件对象等)。既然如此,为什么我们定义一个序列的时候没有使用next方法呢?这是为什么呢?从理论上来讲,只有实现迭代器的对象才可称为可迭代对象。而我们在定义字符串、列表、元组、字典、文件对象的时候,本身没有给出next方法。从这种角度上来看,他们并没有遵循迭代器协议。但是平时我们为什么还是认为他们是可迭代对象呢? Python提供了一个可以让某种数据类型变为可迭代数据类型的方法,即让某种数据类型的对象直接调用__iter__()或iter()方法,此时我们再查看该数据类型的对象时就多出了next方法。下面如我们通过一个简单的实例来分析,我们使用字符窜调用__iter__()方法,然后使用可迭代对象调用next方法。 string = "hello world" myiter = string.__iter__() print

快速看懂HashMap

余生颓废 提交于 2019-12-03 19:49:14
在开始之前,先过一遍本博客的重点 • HashMap寻值的速度快是因为HashMap的键会被映射成Hash值,从而避开用equal方法遍历来加快寻值速度。 • HashMap有初始容量和加载因子两个参数来控制性能。当条目大于容量*加载因子时,容量翻一倍。 • HashMap和Hashtable的区别在于线程安全性,同步,以及速度。 下面开始正文 1.HashMap的具体实现 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: HashMap中我们最常用的就是put(K, V)和get(K)。我们都知道,HashMap的K值是唯一的,所以查询和修改数据的时候只要用equal遍历所有的key值就可以了,但我们知道直接遍历查询的时间复杂度为O(n),在数据量比较大时效率不高,所以在java中运用Hash算法来对所有的key进行运算加入数组中。查询的时候直接用数组下标来访问数据(时间复杂度变成了O(1)),以此绕开了用equal遍历带来的效率损失。 HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null

freemarket 遍历Map

大城市里の小女人 提交于 2019-12-03 18:57:53
<select id="s_province" name="province" onchange ="chagePro();"> <option value="0">省份</option> <#if provceMap?exists> <#list provceMap?keys as key > <option value="${key}">${provceMap[key]} </option> </#list> </#if> </select> 项目上用的spring mvc 前台用的 freemarket 遇到了一个循环map的问题,经过折腾搞定了,现将代码贴出来 如上所示, provceMap 是后台带过来的,其实是遍历它的key 来源: CSDN 作者: lvzi98 链接: https://blog.csdn.net/wangjinwei6912/article/details/21792853

dsu on tree(树上启发式合并)

你说的曾经没有我的故事 提交于 2019-12-03 18:01:37
其实已经做过很多道了,但自己直到现在才重视起来它 以下大部分是看的洛谷日志:=w= 它可以处理一些常见的树上问题: 1.每个节点的答案是其子树的叠加,考虑利用这个性质处理问题 2.就是你必须通过整个子树来更新自己当前节点的信息的这种题 具体实现: 先遍历其非重儿子,获取它的ans,但不保留遍历后它的check 遍历它的重儿子,保留它的chec k 再次遍历其非重儿子及其父亲,用重儿子的check对遍历到的节点进行计算,获取整棵子树的ans 注意: 1.为什么不合并第一步和第三步呢?因为check数组不能重复使用,否则空间会太大,需要在 O(n) 的空间内完成。 时间复杂度:O(nlogn) 优秀之处:可以水树套树的题和吊打树上莫队且常数小 练习题 CF600E Lomsat gelral(http://codeforces.com/problemset/problem/600/E) 题意翻译:树的节点有颜色,一种颜色占领了一个子树,当且仅当没有其他颜色在这个子树中出现得比它多。求占领每个子树的所有颜色之和。 UOJ284 快乐游戏鸡(http://uoj.ac/problem/284) 参考资料/扩展阅读 CF741D作者介绍的dsu on tree(http://codeforces.com/blog/entry/44351) 这位作者的题解(http://codeforces

两序遍历递归建立二叉树

怎甘沉沦 提交于 2019-12-03 16:59:34
前序中序遍历建立二叉树 1 Node * createTree1(string pres, string cens) { 2 if(pres.size() == 0 || cens.size() == 0) { 3 return nullptr; 4 } 5 Node * node = new Node(); 6 node->data = pres.at(0); 7 int key = cens.find(pres.at(0)); 8 9 string mpres = pres.substr(1, key); 10 string mcens = cens.substr(0, key); 11 node->left = createTree1(mpres,mcens); 12 13 mpres = pres.substr(key+1, pres.size()-key-1); 14 mcens = cens.substr(key+1, cens.size()-key-1); 15 node->right = createTree1(mpres,mcens); 16 return node; 17 }; View Code 中序后序遍历建立二叉树 后序中序遍历就是将前序中序遍历中的对前序的操作转换为对后序的操作,前序从第一个开始取,后序从后往前取。对中序操作不变 来源: https:/

二叉树学习

限于喜欢 提交于 2019-12-03 15:41:10
1、前中后三种遍历 比如上图二叉树遍历结果 前序遍历:ABCDEFGHK 中序遍历:BDCAEHGKF 后序遍历:DCBHKGFEA 2、二叉树的创建 (1)按照先序遍历的顺序创建二叉链表 abcd00e00f00ig00h00int flag ,p;p=0; void Create(BiTree &T, char *s) { p++; if (s[p] == '0') T = NULL; else { T = new Node; T->data = s[p]; Create(T->left, s); Create(T->right, s); } } 2、求深度,高度,广度,最长路径 来源: https://www.cnblogs.com/h694879357/p/11802601.html

【批处理】遍历文件,输出文件大小

↘锁芯ラ 提交于 2019-12-03 14:20:59
【示例】 1 echo off & color 0A 2 ::指定起始文件夹 3 set DIR="%cd%" 4 echo DIR=%DIR% 5 6 :: 参数 /R 表示需要遍历子文件夹,去掉表示不遍历子文件夹 7 :: %%i 是一个变量,类似于迭代器,但是这个变量只能由一个字母组成,前面带上%%;%%~zi表示获取该文件大小 8 :: 括号中是通配符,可以指定后缀名,*.*表示所有文件 9 for /R %DIR% %%i in (*) do ( 10 echo %%i 11 echo %%~zi 12 ) 13 pause 来源: https://www.cnblogs.com/utank/p/11799166.html

关于动态规划的一些感想

邮差的信 提交于 2019-12-03 14:20:53
原文链接:https://leetcode-cn.com/problems/maximum-subarray/solution/xiang-xi-jie-du-dong-tai-gui-hua-de-shi-xian-yi-li/ 通常我们遍历子串或者子序列有三种遍历方式 1.  以某个节点为开头的所有子序列: 如 [a],[a, b],[ a, b, c] ... 再从以 b 为开头的子序列开始遍历 [b] [b, c]。 2.  根据子序列的长度为标杆,如先遍历出子序列长度为 1 的子序列,在遍历出长度为 2 的 等等。 3.  以子序列的结束节点为基准,先遍历出以某个节点为结束的所有子序列,因为每个节点都可能会是子序列的结束节点,因此要遍历下整个序列,如: 以 b 为结束点的所有子序列: [a , b] [b] 以 c 为结束点的所有子序列: [a, b, c] [b, c] [ c ]。 第一种遍历方式通常用于暴力解法, 第二种遍历方式 leetcode (5. 最长回文子串 ) 中的解法就用到了。 第三种遍历方式 因为可以产生递推关系, 采用动态规划时, 经常通过此种遍历方式, 如 背包问题, 最大公共子串 , 这里的动态规划解法也是以 先遍历出 以某个节点为结束节点的所有子序列 的思路 来源: https://www.cnblogs.com/da-peng/p

Map集合循环遍历的几种方式

大兔子大兔子 提交于 2019-12-03 13:21:09
package cn.jdbc.test; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; /** * Map 集合的循环遍历 * @data 2018.1.21 * */ public class TestMap { public static void main(String[] args) { Map<String, Object> map = new HashMap<String, Object>(); map.put("aaa", 111); map.put("bbb", 222); map.put("ccc", 333); map.put("ddd", 444); //Map集合循环遍历方式一 System.out.println("第一种:通过Map.keySet()遍历key和value:"); for(String key:map.keySet()){//keySet获取map集合key的集合 然后在遍历key即可 String value = map.get(key).toString();// System.out.println("key:"+key+" vlaue:"+value); } /