遍历

JSP的C标签遍历Map数据

こ雲淡風輕ζ 提交于 2019-12-23 19:02:55
JSP的C标签遍历Map数据 Map可以实现较为丰富的数据封装。 第一种: 控制器传递到页面的map格式如下: Map<String, User> dataMap = new HashMap<String, User>(); dataMap.put(.....);//封装数据过程 model.addAttribute("dataMap", dataMap); User可以为自定义对象 第二种: Map<String, List<User>> dataMap = new HashMap<String, List<User>>(); dataMap.put(.....);//封装数据过程 model.addAttribute("dataMap", dataMap); 针对以上两种Map,jsp遍历时有一点区别 首先,第一种值为单个对象的Map的遍历 <div > <c:forEach items="${dataMap}" var="dataMap"> <c:set var="mapKey" value='${dataMap.key}' /> <c:set var="user" value='${dataMap.value}' /> <p>用户名:{user.username}</p> <p>年龄:{user.age}</p> </c:forEach> </div>

快速失败(fail—fast)和 安全失败(fail—safe)

橙三吉。 提交于 2019-12-23 18:28:21
一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。 原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。 注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。如果集合发生变化时修改modCount值刚好又设置为了expectedmodCount值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。 场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。 二:安全失败(fail—safe) 采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。 原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到

快速失败(fail—fast)和 安全失败(fail—safe)

假装没事ソ 提交于 2019-12-23 18:25:21
一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。 原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。 注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。如果集合发生变化时修改modCount值刚好又设置为了expectedmodCount值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。 场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。 二:安全失败(fail—safe) 采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。 原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到

如何用栈实现递归与非递归的转换

非 Y 不嫁゛ 提交于 2019-12-23 17:48:57
如何用栈实现递归与非递归的转换 一.为什么要学习递归与非递归的转换的实现方法? 1)并不是每一门语言都支持递归的. 2)有助于理解递归的本质. 3)有助于理解栈,树等数据结构. 二.递归与非递归转换的原理. 递归与非递归的转换基于以下的原理:所有的递归程序都可以用树结构表示出来.需要说明的是, 这个"原理"并没有经过严格的数学证明,只是我的一个猜想,不过在至少在我遇到的例子中是适用的. 学习过树结构的人都知道,有三种方法可以遍历树:前序,中序,后序.理解这三种遍历方式的递归和非 递归的表达方式是能够正确实现转换的关键之处,所以我们先来谈谈这个.需要说明的是,这里以特殊的 二叉树来说明,不过大多数情况下二叉树已经够用,而且理解了二叉树的遍历,其它的树遍历方式就不难 了. 1)前序遍历 a)递归方式: void preorder_recursive(Bitree T) /* 先序遍历二叉树的递归算法 */ { if (T) { visit(T); /* 访问当前结点 */ preorder_recursive(T->;lchild); /* 访问左子树 */ preorder_recursive(T->;rchild); /* 访问右子树 */ } } b)非递归方式 void preorder_nonrecursive(Bitree T) /* 先序遍历二叉树的非递归算法 */ {

Java学习之集合框架篇概述

亡梦爱人 提交于 2019-12-23 11:39:16
集合框架被设计成要满足以下几个目标。 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。 对一个集合的扩展和适应必须是简单的。 集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型。接口允许集合独立操纵其代表的细节。在面向对象的语言,接口通常形成一个层次。 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构。 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。 除了集合,该框架也定义了几个Map接口和类。Map里存储的是键/值对。尽管Map不是collections,但是它们完全整合在集合中。 集合接口 集合框架定义了一些接口。本节提供了每个接口的概述: 序号 接口描述 1 Collection 接口 Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。 2 List 接口 List接口是一个有序的 Collection

二叉搜索树的后序遍历序列

点点圈 提交于 2019-12-23 11:01:02
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 首先需要知道,二叉搜索树的特点是,左子树的所有节点的值都小于根节点的值,右子树的所有节点的值都大于根节点的值。后序遍历是按照左——右——根的顺序进行遍历的。所以这道题的大体思路是,根据左子树小于根节点的特点,找到左子树的分界点,然后从右子树开始,看是不是所有的值都大于根节点,如果出现小于根节点的情况,说明不符合要求。然后对左子树 (l, k-1) 和右子树 (k, r-1) 进行递归。当 l >= r 时,说明判断完成,可以返回true。 还有要注意特判一下数组是否为空,如果为空,直接返回false。 c++代码如下: 1 class Solution { 2 public: 3 vector<int> seq; 4 bool VerifySquenceOfBST(vector<int> sequence) { 5 seq = sequence; 6 if(seq.empty()) return false; 7 return dfs(0, seq.size() - 1); 8 } 9 10 bool dfs(int l, int r){ 11 if(l >= r) return true; 12 int k = l; 13 while

JAVA学习笔记--迭代器

和自甴很熟 提交于 2019-12-23 09:55:18
  迭代器(Iterator)是一种设计模式。 它是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构 。创建迭代器的代价小,因而迭代器通常被称为轻量级对象。 一、Iterable   接口Iterable<T>,是Collection<E>等接口的超级接口。实现这个接口允许对象成为 foreach 语句的目标。 import java.util.iterator; public interface Iterable<T>{ Iterator<T> iterator(); // 返回一个在一组T类型的元素上进行迭代的迭代器 } 二、Iterator   接口Iterator<E>,是对Collection进行迭代的迭代器。   方法:Iterator<E> iterator(); // 返回在此collection元素上进行迭代的迭代器,元素返回的顺序没有保证   JAVA的Iterator只能单向移动。使用方法iterator()要求容器返回一个在该collection上进行迭代的迭代器,Iterator将准备好返回序列中的第一个元素。 package com.tongye.iterator; import java.util.*; public class IteratorExample { public static void main

OI树上问题 简单学习笔记

折月煮酒 提交于 2019-12-23 03:11:12
判断链 每个点的度数不超过2 判断树 n个点,n-1条边 每两个点之间的路径唯一 多叉树转换成二叉树 第一个孩子作为左孩子,第一个孩子的兄弟作为它的右孩子。 最小生成树 切割性质 假定所有边权均不相同。设S为既非空集也非全集的V的子集,边e是满足一个端点在S内,另一个端点不再S内的所有边中权值权值最小的一个,则图G的所有生成树均包含e。 回路性质。假定所有边权均不相同。设C为图G的任意回路,边e是C上权值最大的边,则图G的所有生成树均不包含e。 增量最小生成树 从包含的n个点的空图开始,依次加入m条带权边。每加入一条边,输出当前图中最小生成树权值(如果当前图不联通,输出无解)。 如果加入一条边(u,v)后,图中恰好包含一个环,根据回路性质,删除该葫芦上权值最大的边即可,因此只需要在加边之前的MST中找到u到v唯一路径上权值最大的边,再和e比较,删除权值较大的一条。由于路径唯一,可以用DFS或者BFS找到这条u到v的路径,总时间复杂度为 \(O(nm)\) 。 最小瓶颈生成树 给出加权无向图,求一个最小生成树,使得最大边权值尽量小。 每颗最小生成树一定是最小瓶颈生成树,每颗最小瓶颈生成树却不一定是最小生成树 最小瓶颈路 给定加权无向图的两个结点u和v,求出从u到v的一条路径,使得路径上的最长边尽量短。 我们直接求出这个图的最小生成树,则起点和终点在书上的唯一路径就是我们要找的路径

基于插入排序的算法实现(只是实现自己最初的想法)

梦想与她 提交于 2019-12-22 14:28:48
这次排序算法的设计思想是从一个数组的1索引开始,进行数组的遍历,并且一直确保正在遍历的索引值之前的数据是有序的,每次遍历一个数据时,将其放置到合适的位置上即可,但是该算法的判断条件过多,会显得比较麻烦,且每次从后往前找到合适的位置时,都要平均将数组的一半大小的数据进行移动,因此,这次代码的实现仅仅是个人想法的实现. 外层循环用 i 去遍历整个数组,内层循环用j从后往前判断array[j]与array[i]的大小关系 该算法的弊端需要判断三种不同的情况,处理结果也不完全相同,为了简化代码,合并其中注释的条件,设置flag进行条件判断 代码如下: import java.util.Arrays; public class InsertionSort { public static void insertSort(int[] array){ out: for (int i =1;i<array.length;i++){ int temp1 = array[i]; for(int j =i-1;j>=0;j--){ //在左侧找到比基准值小的数据,说明它的下一个数据就应该是array[i]的位置, //在该条件下,又应该判断是否进行值交换(即是否二者相邻,从而确定要不要进行将arra[j+1] = temp1) if((array[j]<temp1)) { boolean flag =

***PHP 遍历数组的方法foreach

眉间皱痕 提交于 2019-12-22 12:54:51
foreach http://php.net/manual/zh/control-structures.foreach.php (PHP 4, PHP 5) foreach 语法结构提供了遍历数组的简单方式。 foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。有两种语法: foreach (array_expression as $value) statement foreach (array_expression as $key => $value) statement 第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。 第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key 。 还能够自定义 遍历对象 。 Note: 当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 reset() 。 由于 foreach 依赖内部数组指针,在循环中修改其值将可能导致意外的行为。 可以很容易地通过在 $value 之前加上 & 来修改数组的元素。此方法将以 引用 赋值而不是拷贝一个值。 <?php $arr = array