遍历

foreach和for循环的区别

╄→尐↘猪︶ㄣ 提交于 2019-12-09 04:54:52
for循环 for循环,通过下标,对循环中的代码反复执行,功能强大,可以通过index取得元素。在处理比较复杂的处理的时候较为方便。 foreach循环 foreach,从头到尾,对于集合中的对象遍历。适用于简单的遍历。 foreach使用的时候,会锁定集合的对象,期间不能进行修改。 使用的选择 foreach相对于for循环,代码减少了,但是foreach依赖IEnumerable。在运行的时候效率低于for循环。当然了,在处理不确定循环次数的循环,或者循环次数需要计算的情况下。使用foreach比较方便。而且foreach的代码经过编译系统的代码优化后,和for循环的循环类似。 可以说,foreach语句是for语句的特殊简化版本,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。在复杂的循环设计时,还是应该使用for循环更加的灵活。 转载于:https://www.cnblogs.com/liyasong/p/6387843.html 来源: CSDN 作者: weixin_30659829 链接: https://blog.csdn.net/weixin_30659829/article/details/98670738

编程中,循环、迭代、遍历和递归之间的区别

白昼怎懂夜的黑 提交于 2019-12-09 04:54:01
表示“重复”这个含义的词有很多, 比如循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 循环 算是最基础的概念, 凡是重复执行一段代码, 都可以称之为循环. 大部分的递归, 遍历, 迭代, 都是循环. 递归 的定义是, 根据一种(几种)基本情况定义的算法, 其他复杂情况都可以被逐步还原为基本情况. 在编程中的特征就是, 在函数定义内重复调用该函数. 例如斐波那契数列, 定义F(0)=1, F(1)=1, 所有其他情况: F(x)=F(x-1)+F(x-2). 所有大于1的整数经过有限次的反推之后都可以转换到两种基本情况. 而在编程中, 算法则是这样的: int F(x) { if(x==0 || x==1) return 1; //这里是退出递归的条件, 以保证在有限次递归后能够得到结果 return F(x-1)+F(x-2); //转化为更为基本的情况, 重复调用自身进行计算 } 迭代在数学和编程中有不同的含义. 迭代(数学) : 在循环的基础上, 每一次循环, 都比上一次更为接近结果. 例如下面是一个迭代的例子: int result = 0; for(int i=0; i<10; i++) result += i; //每一次循环之后, result都更加接近结果45 有很多数学问题, 都是迭代算法, 如牛顿迭代法

【java】for和foreach的区别

六眼飞鱼酱① 提交于 2019-12-09 04:48:06
一、概述 普通for循环在遍历集合时使用下标来定位集合中的元素。java在JDK1.5开始支持foreach循环,foreach在一定程度上简化了对集合的遍历。但某些情况下,foreach是不能完全代替for循环的。 限制场景: 1、foreach适用于 数组 或实现了 iterator的集合类 。foreach就是使用Iterator接口来实现对集合的遍历的。 2、在用foreach循环遍历一个集合时,不能改变集合中的元素,如增加元素、修改元素。否则会抛出ConcurrentModificationException异常。想了解原因的可以 研究一下源码 。 也不能修改集合中的元素(不报异常),但可以修改元素的属性。 二、验证之旅 (1)添加或移除元素 添加和移除是一样的,这里只给出了移除的代码。感兴趣的童鞋们可以自己试一试,毕竟纸上得来终觉浅嘛。 1、普通for循环进行添加或移除元素 由输出结果可知,普通for循环,成功移除了元素“jingjing”。 2、foreach循环添加或移除元素 由输出结果可知,foreach循环抛出ConcurrenModificationException异常。 (2)修改元素 1、普通for循环修改元素 由输出结果可知,普通for循环成功将list集合中的每一个元素修改成“nini” 2、foreach循环修改元素 由输出结果可知 ,

20182324 2019-2020-1 《数据结构与面向对象程序设计》实验9报告

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-08 22:22:27
20182324 2019-2020-1 《数据结构与面向对象程序设计》实验9报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 殷宇豪 学号: 20182324 实验教师:王志强 实验日期:2019年12月2日 必修/选修: 必修 1.实验内容 1.初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数) 2.图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历) 3.完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环 4.完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出 5.完成有向图的单源最短路径求解(迪杰斯特拉算法) 2. 实验过程及结果 (1)根据屏幕提示初始化无向图和有向图 (2)完成有向图和无向图的遍历 (3)图的拓扑排序 (4)无向图的最小生成树 (5)图的单源最短路径求解 3. 实验过程中遇到的问题和解决过程 问题1:对 Java 中 Iterator 的理解 问题1解决方案: java.util.Iterator 在 JDK 帮助文档中这样阐述:public interface Iterator<E> 对 collection 进行迭代的迭代器。迭代器取代了 Java

20182326 2019-2020-1 《数据结构与面向对象程序设计》实验九报告

混江龙づ霸主 提交于 2019-12-08 21:47:33
20182326 2019-2020-1 《数据结构与面向对象程序设计》实验九报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 刘颖洁 学号:20182326 实验教师:王志强 实验日期:2019年12月2日 必修/选修: 必修 1.实验内容 (1) 初始化:根据屏幕提示(例如:输入1为无向图,输入2为有向图)初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数)(2分) (2) 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历)(4分) (3) 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环(3分) (4) 完成无向图的最小生成树(Prim算法或Kruscal算法均可),并输出(3分) (5) 完成有向图的单源最短路径求解(迪杰斯特拉算法)(3分) 2. 实验过程及结果 (1) 初始化:根据屏幕提示初始化无向图和有向图 (2) 图的遍历:完成有向图和无向图的遍历(深度和广度优先遍历) (3) 完成有向图的拓扑排序,并输出拓扑排序序列或者输出该图存在环 (4) 完成无向图的最小生成树,并输出 (5) 完成有向图的单源最短路径求解 3. 实验过程中遇到的问题和解决过程 问题1: 问题1解决方案: 问题2: 问题2解决方案: 其他(感悟、思考等) 复习了以前的知识

海量数据中的TopK问题

青春壹個敷衍的年華 提交于 2019-12-08 18:34:14
1. 抛出问题 在大规模数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题。例如,在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载最高的前10首歌等。 针对top K类问题,通常比较好的方案是分治+Trie树/hash+小顶堆(就是上面提到的最小堆),即先将数据集按照Hash方法分解成多个小数据集,然后使用Trie树活着Hash统计每个小数据集中的query词频,之后用小顶堆求出每个数据集中出现频率最高的前K个数,最后在所有top K中求出最终的top K。 eg:有1亿个浮点数,如何找出其中最大的10000个? 2. 如何解决 1)全局排序法 这是最容易想到的方法,将数据全部排序,然后在排序后的集合中进行查找,最快的排序算法的时间复杂度一般为O(nlogn),如快速排序。 但是在32位的机器上,每个float类型占4个字节,1亿个浮点数就要占用400MB的存储空间,对于一些可用内存小于400M的计算机而言,很显然是不能一次将全部数据读入内存进行排序的。其实即使内存能够满足要求(我机器内存都是8GB),该方法也并不高效,因为题目的目的是寻找出最大的10000个数即可,而排序却是将所有的元素都排序了,做了很多的无用功。 2)局部淘汰法 该方法与全局排序法类似

海量数据处理实例

醉酒当歌 提交于 2019-12-08 17:55:18
在bat等大公司,基本所有业务的数据量级都很庞大,那么如何在保证数据完整性的情况下快速处理成了一个通用的难题,这里列举几个例子,大致反应一些处理思想。 1.一个文件中,每一行有一个整数,有上亿行,目的:统计出现次数超过三次的整数写入到另一个文件中。 分析: (1)首先数据在文件中,既然要统计,那么有一个原则就是减少IO次数。 (2)其次数据量上亿,内存中肯定不可能全放下。 (3)需要统计次数,那么就需要知道每个整数的出现次数。 问题:既然内存中放不下每一个数据,那么就没办法知道当前拿到的数据出现了几次,也就不知道应不应该把它写入到目标文件中去。 思考:上亿的数据无法存放在内存中,我们先缩小数据量级,100w的数据是可以放在内存中的,那么我们是不是可以把上亿的数据分成100份100w的数据分开处理呢。 解决思路:先轮询一遍整个文件,对数据进行分片,分片规则:0<= num <100w放一个文件,100w<= num <200w放一个文件,依此类推。那么现在就会分为多个小文件了,我们就可以一个一个处理了,总的会进行2次IO,时间复杂度就是2n了。(PS:分治的方法,需要遍历两次,也可以使用位图,值需要遍历一次,但位图有限制,只能缩小32倍,2G内存最多可存放2^34个整数对应的位) 2.海量日志数据,提取出某日访问网站次数最多的IP 分析: (1)日志数据极其庞大

【Python】Python读取文件夹下的所有文件

ぐ巨炮叔叔 提交于 2019-12-08 07:36:30
os.listdir(path)是得到在path路径下所以文件的名称列表。 open(path)是打开某个文件。 iter是python的迭代器。 所以读取某文件夹下的所有文件如下: import os path = "D:/Python34/news" #文件夹目录 files= os.listdir(path) #得到文件夹下的所有文件名称 s = [] for file in files: #遍历文件夹 if not os.path.isdir(file): #判断是否是文件夹,不是文件夹才打开 f = open(path+"/"+file); #打开文件 iter_f = iter(f); #创建迭代器 str = "" for line in iter_f: #遍历文件,一行行遍历,读取文本 str = str + line s.append(str) #每个文件的文本存到list中 print(s) #打印结果 你也可以把遍历文件夹的操作定义成一个函数,如果是文件夹就不断迭代遍历。进而读取文件夹下所有的文件(包括文件夹里中的文件) Author:立礼 Sign:人生不要有太多的幻想,而要有更多的行动 来源: CSDN 作者: 励志故事 链接: https://blog.csdn.net/LZGS_4/article/details/50371030

Z字形编排问题-Java实现

佐手、 提交于 2019-12-08 06:59:23
背景 Z字形编排过程大致是这样的:经过前期处理的图像被分为若干个 的小图像块,此时就从小图像块的左上角开始沿Z字形对图像元素进行遍历,并将遍历所得的结果重新写入等大小的图像块中 经过Z自行排列之后,原图像矩阵中的序号变为如下图所示: 总结规律 对于原始矩阵matrix中的任意元素matrix[i][j]的遍历走向规律可以分为如下三种情况(偶数情况下) 1、如果二维数组中的元素matrix[i][j]中纵坐标j是偶数,且i=0或者i=7,那么遍历路径在矩阵中的走向就是水平向右移动一格。 2、如果二维数组中的元素matrix[i][j]中横坐标i是奇数,且j=0或者j=7,,那么遍历路径在矩阵中的走向就是垂直向下移动一格。 3、除上述规则以外的情况,如果二维数组中的元素matrix[i][j]的横纵坐标和i+j是偶数,则遍历路径在矩阵中的走向就是右上角移动一格;否则,若i+j是奇数,则遍历路径在矩阵中的走向就是左下角移动一格。 当然也需要对奇数情况进行分析,过程和偶数过程一样; Java代码实现 import java.util.Scanner; /** * Z字行编排问题 * 算法之美P48 * Created by xuliugen on 2016/8/18. */ public class ZZiBianPai { public static int SIZE = 8 ; /

字符串转换成整数(Java)

风格不统一 提交于 2019-12-08 06:05:25
题目:字符串转换为整数。 思路: 将字符串转化为整数首先是遍历字符串中的每一个字符,有三种情况:首字符是正号,首字符是负号,首字符非正负号;然后遍历每一个字符进行num = num * 10 + charArray[i] - '0',在进行这个工作之前首先需要对charArray[i]进行是否为数字字符的判断,循环遍历直到结束,输出结果; 注意事项(思考点): (1)字符串中包含有非数字字符;(2)字符串中包含正负符号;(3)考虑最大的正整数;(4)考虑最小的负整数;(4)溢出。 开始时我的想法只考虑了第一,第二种情况: /** * 将字符串转换为整数 1:非数字字符 2:正负号 * @author Peter */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.nextLine(); int length = str.length(); int number = 0; char[] charArray = str.toCharArray(); if (charArray[0] == '-') { for (int i = 1; i < length; i++) { if (charArray[i] >