遍历

Map的四种遍历方式和两种删除方式

喜你入骨 提交于 2020-01-11 02:33:32
首先,创建一个map并存入数据 Map<String,Integer> map=new HashMap<String,Integer>(); map.put(“小李”, 20); map.put(“校长”, 21); map.put(“小王”, 25); 一、Map的遍历 1、遍历map的key组成的Set集合和value组成的集合(不是Set集合了) for (String str : map.keySet()) { System.out.println(“key=”+str+";value="+map.get(str)); } for (Integer num : map.values()) { System.out.println(“value=”+num); } 2、遍历map的entry键值对(Set集合) for (Map.Entry<String, Integer> entry: map.entrySet()) { System.out.println(entry.getKey()+":"+entry.getValue()); } 3、使用迭代器获取Map的entry集合从而遍历 for (Iterator<Map.Entry<String,Integer>> it=map.entrySet().iterator();it.hasNext()😉 { Map.Entry

设计模式(十六)迭代器模式 Iterator

风流意气都作罢 提交于 2020-01-11 01:46:03
什么时候需要用到迭代器模式?   有许多中方法,可以把对象堆起来放进一个集合(可以是数组、堆栈、列表、哈希表,等等)。   每一种类型的集合,都有各自适用的时机。但是某个时间段,客户端可能希望去遍历这个集合。   怎么做?   让客户去得到这个集合的具体实现?显然这不是很现实。   而且针对不同的集合,我们需要用不同的方式去遍历它,这需要去深入了解各种数据结构,对客户端很不友好。   这时候,我们希望创建一种超集合(super collection),是客户端能够使用统一的方法去遍历集合,同时不需要关心具体的数据结构。   这就是迭代器模式。 迭代器模式:   迭代器模式提供一种方法,顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。   从 Java 的角度来说,迭代器模式就是 Iterator 接口。 模拟场景:   有一个水果商店(FruitShop),内部采取数组的方式存储数据。   有一个肉食商店(MeatShop),内部采用链表的方式存储数据。   客户端希望去遍历这些数据, 没有迭代器的实现: public final class FruitShop { private String[] products = new String[MAX_PRODUCT]; private int index = 0; private static final int MAX

附2 volatile

馋奶兔 提交于 2020-01-11 01:43:35
注:在看这篇文章之前,如果对ArrayList底层不清楚的话,建议先去看看 ArrayList 源码解析。 http://www.cnblogs.com/java-zhao/p/5102342.html 1、对于CopyOnWriteArrayList需要掌握以下几点 创建:CopyOnWriteArrayList() 添加元素:即add(E)方法 获取单个对象:即get(int)方法 删除对象:即remove(E)方法 遍历所有对象:即iterator(),在实际中更常用的是增强型的for循环去做遍历 注:CopyOnWriteArrayList是一个线程安全,读操作时无锁的ArrayList。 2、创建 public CopyOnWriteArrayList() 使用方法: List<String> list = new CopyOnWriteArrayList<String>(); 相关源代码: private volatile transient Object[] array;//底层数据结构 /** * 获取array */ final Object[] getArray() { return array; } /** * 设置Object[] */ final void setArray(Object[] a) { array = a; } /** *

java集合总结

元气小坏坏 提交于 2020-01-10 22:45:24
一、集合的由来   通常,我们的程序需要根据程序运行时才知道创建多少个对象。但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型。为了满足这些常规的编程需要,我们要求能在任何时候,任何地点创建任意数量的对象,而这些对象用什么来容纳呢?我们首先想到了数组,但是数组只能放统一类型的数据,而且其长度是固定的,那怎么办呢?集合便应运而生了! 为了对集合有个更加深入的了解,可以看我的这一篇文章: 用 Java 数组来实现 ArrayList 集合 http://www.cnblogs.com/ysocean/p/6812674.html 二、集合是什么?   Java集合类存放于 java.util 包中,是一个用来存放对象的容器。 注意:①、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。    ②、集合存放的是多个对象的引用,对象本身还是放在堆内存中。    ③、集合可以存放不同类型,不限数量的数据类型。 发现一个特点,上述所有的集合类,除了 map 系列的集合,即左边集合都实现了 Iterator 接口,这是一个用于遍历集合中元素的接口,主要hashNext(),next(),remove()三种方法。它的一个子接口 ListIterator

Iterator和ListIterator关系

烂漫一生 提交于 2020-01-10 12:38:41
一.相同点 都是迭代器,当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。 二.不同点 1.使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。 2.ListIterator有add方法,可以向List中添加对象,而Iterator不能。 3.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。 4.ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。 5.都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。 方法详细信息 hasNext boolean hasNext() 以正向遍历列表时,如果列表迭代器有多个元素,则返回 true (换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true )。 指定者: 接口 Iterator < E > 中的 hasNext 返回: 如果以正向遍历列表

java集合

空扰寡人 提交于 2020-01-10 10:22:43
转自:http://www.cnblogs.com/ysocean/p/6555373.html 一、集合的由来   通常,我们的程序需要根据程序运行时才知道创建多少个对象。但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型。为了满足这些常规的编程需要,我们要求能在任何时候,任何地点创建任意数量的对象,而这些对象用什么来容纳呢?我们首先想到了数组,但是数组只能放统一类型的数据,而且其长度是固定的,那怎么办呢?集合便应运而生了! 为了对集合有个更加深入的了解,可以看我的这一篇文章: 用 Java 数组来实现 ArrayList 集合 http://www.cnblogs.com/ysocean/p/6812674.html 二、集合是什么?   Java集合类存放于 java.util 包中,是一个用来存放对象的容器。 注意:①、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。    ②、集合存放的是多个对象的引用,对象本身还是放在堆内存中。    ③、集合可以存放不同类型,不限数量的数据类型。 三、Java 集合框架图 此图来源于: http://blog.csdn.net/u010887744/article/details

ES6之Set和Map

自古美人都是妖i 提交于 2020-01-10 07:17:15
一、Set 1.set的基本属性和方法 Set类似于数组,不过于数组不同的是,Set中的成员都是唯一的,即使重复添加,也不会添加到Set中去,我们通过构造函数Set()来新建一个Set,以便于更深入的了解。 const set = new Set() 通过构造函数新建Set实例后,我们可以看到 Set有一些方法和属性,下边我们来了解这些属性和方法。 size: Set中成员的数量 Set(): 构造方法 has(): 判断Set中是否含有某个值,返回布尔类型 add(): 向Set中添加数值 delete(): 删除Set中的值,返回布尔类型 clear():清除Set中的所有数 keys():遍历Set中的所有键 values():遍历Set中的所有值 entries():遍历Set中的所有项 forEach():遍历Set中的所有键值对 2. Set与数组的相互转换 2.1 set 转数组 const set = new Set ( [ 1 , 2 , 3 , 3 ] ) [ ... set ] // [1,2,3] Array . from ( set ) //[1,2,3] 2.2 数组转set const arr = [ 1 , 2 , 3 , 3 , 4 ] const set = new Set ( arr ) // set(4) {1,2,3,4} 3.数组去重

LeetCode 107——二叉树的层次遍历II

China☆狼群 提交于 2020-01-10 07:06:36
一、题目介绍 给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其自底向上的层次遍历为: [ [15,7], [9,20], [3] ] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 二、解题思路 利用队列实现 二叉树的层次遍历 ,将每层的遍历结果保存到一个二维的动态数组中,最终将动态数组中的元素按照插入顺序进行反转。 三、解题代码 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int>> levelOrderBottom(TreeNode*

遍历文件总结

試著忘記壹切 提交于 2020-01-10 06:58:42
1.遍历主要用到os模块的walk和listdir两个模块。查看os源码不难发现,使用os.walk将返回遍历目录的路径,文件夹名,与文件名。listdir方法以list的数据结构返回文件名 2.源码分享,主要形式为三种. import collections import subprocess import platform import os # 获取指定目录下,指定格式的文件, Usage:get_all_files('/Case', '.yaml') def get_all_files(root: str, pattern: str)-> dict: extension_file = collections.OrderedDict() for root, dirs, files in os.walk(root): for filename in files: if filename.endswith(pattern): path = os.path.join(root, filename).replace('\\', '/') extension_file[filename] = path return extension_file # TODO:递归遍历指定目录,只获取文件名,待优化 def iter_files(path): filename = [] def

SQL EXISTS与IN的区别(2)

安稳与你 提交于 2020-01-10 05:58:15
select * from A where id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完A表的所有记录. 它的查询过程类似于以下过程 List resultSet=[]; Array A=(select * from A); Array B=(select id from B); for(int i=0;i<A.length;i++) { for(int j=0;j<B.length;j++) { if(A[i].id==B[j].id) { resultSet.add(A[i]); break; } } } return resultSet; 可以看出,当B表数据较大时不适合使用in(),因为它会B表数据全部遍历一次. 如:A表有10000条记录,B表有1000000条记录,那么最多有可能遍历10000*1000000次,效率很差. 再如:A表有10000条记录,B表有100条记录,那么最多有可能遍历10000*100次,遍历次数大大减少,效率大大提升. 结论:in()适合B表比A表数据小的情况 select a.* from A a where exists(select 1 from B b where