gistfile1.txt 十年饮冰 难凉热血复习:使用break语句可以终止switch语句或者循环的执行Break label:跳出label标记的本层循环Continue label:跳过label标记的本次循环,执行下一次循环Else if多重嵌套
十年饮冰 难凉热血 复习: 使用break语句可以终止switch语句或者循环的执行 Break label:跳出label标记的本层循环 Continue label:跳过label标记的本次循环,执行下一次循环 Else if多重嵌套: If()语句一 Else if()语句二 Else if()语句三 .... Else()语句N 哪个判断条件true了,就执行对应的语句,并且不再判断 Switch(表达式):该表达式必须为byte short char int类型之一 循环语句for(正常结束循环出口){ Break;//非正常结束循环出口 } while先判断,后执行;do-while先执行后判断 只要第一次不为假,while和do-while就执行相同次数 System.in.read();//从键盘缓冲区取出一个字符的ascii码,如果没有,则就会处于光标等待状态 键盘输入,回车,至少会给内存缓冲区加两个字符 ‘\r’ ‘\n’ Ascii: 13 10 我只担心一件事情,我取得的成就配不上我遭受的苦难。 模式匹配:求子串在父串中出现的位置 最朴素的算法:一个一个比,即使子串的第一个字符都匹配不上,也要傻乎乎的比完子串,算法如下: Test://用1able标记 For(I=0;I<=16;I++){//I<父串长度-子串长度 Flag=true; //如果内层循环结束之后,flag还是true,那就匹配成功 j=i;//用一个j来标记父串比较字符的位置 For(k=0;k<4;k++){//比较对应字符是否相等 If(searchline.charAt(j)!=substring.charAt(k)){ Flag=false; } J++;//比较父串的下一个位置的字符 } If(flag==true){ System.out.println(i);//输出子串在父串中的位置 Break test;//跳出test标记的循环 } } 稍微优化的朴素算法:只要子串有一个字符没匹配上,那就移位再匹配,,第二步作业算法如下: test://用1abel标记 For(I=0;I<=16;I++){//最多比较16次 j=i;//用一个j来标记父串比较字符的位置 For(k=0;k<4;k++){//比较对应字符是否相等 If(searchline.charAt(j)!=substring.charAt(k)){ Continue test;//一旦有一个字符不匹配,那就跳过test标记的本次循环,进行下一次循环 } J++;//比较父串的下一个位置的字符 } List.add(i);//不再跳出循环,声明一个集合用来保存子串在父串的位置 } 第三部作业的解决方法之一如下: 先找出子串在父串中的所有位置,保存为一个集合Index 定义一个空字符串result,取到替换部分字符串的前面部分和替换部分拼起来 public String replaceString(String str, String substr, String restr) { //找出子串在父串中的所有位置,并用集合index保存 Listindex = (ArrayList) StringMatch(str, substr); //输出有多少个位置 System.out.println("索引长度为:" + index.size()); //判断父串中是否有相同子串存在 if (index.isEmpty()) { System.out.println("所选的字符串不在源字符串中!!"); return null; } // 当index中存在数据才会执行下面的代码 int length = index.size();//获取index的长度 String result = "";//创建一个result字符串 int j = 0, i = 0;//初始化两个标记 for (i = 0; i < length; i++) {//当index里面还有值时 if (index.get(i) == 0) {//如果index里对应下标为0,第一个位置 result += restr;//那就在result开头加上更替字符串 } else { // 取到替换部分字符串的前面部分和替换部分拼起来 result+=str.substring(j, index.get(i))+restr; } // 将下标移到替换字符串完毕位置的下一个字符 j = index.get(i) + substr.length(); } if (j < str.length()) { // 当j大于length的时候就越界了 result += str.substring(j, str.length()); } return result; } 新姿势: 数组:存放数据的一个容器:第一,存放数据的类型必须一致;第二,是一段连续的存储空间,在创建的时候,就确定了固定的长度 顺序存储结构,方便查找,但是在元素间删除或者插入,要移动后面的所有数据元素,数组元素是从0开始的 数组的定义方式:类型[] 数组名;//推荐 类型 数组名;//不推荐,c语言风格 基本类型的数组: Int[] a;//数组变量的定义,在栈中开辟int[]类型的变量空间 a = new int[5];//在堆中创建一个int[]类型的对象:包含五个int类型的元素(相当于五个变量),初始值为0;把这个对象的地址给a a是数组名,指向数组的首地址(int[]对象的第一个变量空间的地址)a[1]是元素名,先找到首元素地址a[0],再找到a[1]的位置(间接寻址) 初始化:定义的时候给它设值,只能一次 赋值:可以多次赋值 Int[] a={1,2,3,4,5};//静态设值,初始化 Int []num;//定义的时候不知道数组的长度 num = new int[]{1,2,3};//初始化设置的时候才确定数组元素的个数,再分配空间 Int[] b = new int[16]; b = num;//把num数组对象的地址给b了,他们就指向同一个对象的地址了,他们共享这个对象里的元素, 引用类型的数组: String[] s;//在栈中定义一个String[]类型的变量,用来保存都是String类型元素的数组对象的地址 s = new String[5];//在堆中开辟一个String[]的数组对象,里面有五个String类型的元素,初始值为Null String[] s={’one’,’two’};//初始化,String对象’one’在堆中创建,s[0]保存该对象的地址(数组元素是从0开始的) String[]s; S = new String[]{’one’,’two’};//String对象‘one’在方法区的常量池里创建;s[0]保存该对象的地址 Arg s = new String[0];//无意义的空数组对象 用数组进行排序: 冒泡排序BubbleSort: 排序思想:大的沉下去,小的浮上来,相邻比较,交换 Int[] a={12,43,23,56,8};//五个元素,n=5 算法: For(I=0;I a[j+1]){ A[j]与a[j+1]交换; } } } 交换x,y:声明一个局部变量t t=x; x=y; y=t; 老师开始说的冒泡排序调用swap(x,y)方法,排序失败的原因是:传进数组中的两个元素是基本类型的,swap方法得到的是这两个元素的复制,在swap方法的工作空间里对这两个元素的复制的任何操作都不影响堆区a对象中的这两个元素本身 往方法里传基本类型参数是没用哒,要传引用类型喔 选择排序selectSort: 排序思想:先选第一个元素,然后让别的元素跟他比较,比他大不动,比他小置换,比较一次完毕,就确定了最小的,除去最小的,再对省下元素重复 算法: For(I=0;I a[j]){ A[i]与a[j]交换; } } } 插入排序insertSort: 排序思想:把一个数插入到一个有序数组中,让这个数组依然有序 先认为只有第一个元素的数组,是有序的,然后再插第二个元素,比第一个大就插后面,小就插前面;插入第三个元素的时候,跟第二个元素比较,比他大就插后面,比他小就再跟前一个元素比较。