黑马程序员-Java基础知识-day04
来源:互联网 发布:笔趣阁软件最新版 编辑:程序博客网 时间:2024/05/01 00:53
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
数组的常见操作
1.遍历
class ArrayDemo{ public static void main(String[] args) { //数组的操作:获取数组中的元素,通常会用到遍历 //int[]arr = new int[3]; int[]arr = {3,6,4,1,9,6,0}; //数组中有一个属性可以直接获取到数组元素个数:length。 //使用方式:数组名称.length /* for(int x=0; x<arr.length; x++) { System.out.println("arr["+x+"]="+arr[x]+";"); } */ printArray(arr); }
//定义一个打印数组的方法(函数)
public static void printArray(int[] arr) { System.out.print("[");//为了输出的结果好看,这里直接输出一个正括号 for(int x=0; x<arr.length; x++) { if(x!=arr.length-1)//只要x不等于数组的最后一个元素,就输出一个数组元素和一个逗号 System.out.print(arr[x]+","); else System.out.println(arr[x]+"]"); } }}
小结:length:可以直接获取数组元素的个数或者长度。
2、获取最值
给定一个数组{5,1,6,4,2,8,9}
1.获取数组中的最大值,以及最小值。
获取数组中的最大值。
思路:
1.获取最值需要进行比较,每一次比较都会有一个较大的值,因为该值不确定,通过一个变量进行临存。
2.让数组中的每一个元素都和这个变量中的值进行比较,如果大于了变量中的值,就用该变量记录较大值。
3.当所有的元素都比较完成,那么该变量中存储的就是数组中的最大值了。
步骤:
1.定义变量,初始化为数组中任意一个元素即可。
2.通过循环语句对数组进行遍历。
3.在变量过程中定义判断条件,如果遍历到的元素比变量中的元素大,就赋值给该变量;
需要定义一个功能来完成,以便提高函数复用性。
1.明确结果,数组中的最大值
2.未知内容,一个数组,int[]
*/
class ArrayTest{ public static int getMax(int[] arr) { int max = arr[0]; for(int x=1; x<arr.length; x++)//之所以将x定义为1,是为了少比较一次 { if(arr[x]>max) max= arr[x]; } return max; } //获取最值的另一种方法 //可不可以将临时变量初始化为0呢?可以,这种方式,其实是在初始化为数组中任意一个角标。 public static int getMax_2(int[] arr)//将需要操作的数组传递进来int[]arr { intmax = 0; for(int x=1; x<arr.length; x++) { if(arr[x]>arr[max]) max= x; } return arr[max]; } public static void main(String[] args) { int[]arr = {5,1,6,4,2,8,9}; int max = getMax(arr); System.out.println("max="+max); }}
小结:程序中定义的max,其实是可以定义两种方法的,第一种就是直接赋值为数组中的一个元素,即arr[0],这样返回值就直接得到的是一个元素;第二种方法就是可以将其定义为数组元素中的一个角标,也就是arr[max],这样获取的值在经过arr数组封装后也能得到相应结果。通俗的说就是可以将max定义为数组中的元素或者角标。
3、常见排序方法
3.1选择排序法
对给定数组进行排序:{5,1,6,4,2,8,9}
class ArrayTest2{ //定义一个排序方法:选择排序法 //选择排序:内循环结束一次,最值出现在头角标的位置上。 public static void selectSort(int[] arr) {//由于不需要比较到最后一个元素,因此这里可以将其长度-1,减少一次比较,提高效率 for(int x=0; x<arr.length-1; x++) { for(int y=x+1; y<arr.length; y++) { if(arr[x]>arr[y]) { int temp = arr[x]; arr[x]=arr[y]; arr[y]= temp; } } } } //冒泡排序 public static void bubbleSort(int[] arr) { for(int x=0;x<arr.length-1; x++) { for(int y=0;y<arr.length-x-1; y++)//-x:让每一次比较的元素逐渐减少,-1:避免角标越界 { if(arr[y]>arr[y+1]) { /* int temp = arr[y]; arr[y]= arr[y+1]; arr[y+1]= temp; */ swap(arr,y,y+1); } } } } //发现无论什么排序,都需要对满足条件的元素进行位置置换 //所以可以吧这部分相同代码提取出来,单独封装成一个函数 public static void swap(int[] arr,int a,int b) { int temp = arr[a]; arr[a]= arr[b]; arr[b]= temp; } public static void main(String[] args) { int[]arr = {5,1,6,4,2,8,9}; //排序前 printArray(arr); //排序 //selectSort(arr); bubbleSort(arr); //排序后 printArray(arr); //Arrays.sort(arr);//java中已经定义好了一种排序方法,开发时就用这种排序方法 } //定义一个遍历数组的方法 public static void printArray(int[] arr) { System.out.print("["); for(int x=0; x<arr.length; x++) { if(x!=arr.length-1) System.out.print(arr[x]+","); else System.out.println(arr[x]+"]"); } }}小结:
选择排序:头元素与后面的元素一一比较,也就是内循环结束一次,最值出现在头角标位置上;接着头元素自增,循环与后面的元素进行比较,即可得到排序结果。大圈套小圈,尖朝下,改变内循环初始值
冒泡排序:相邻的两个元素进行比较,如果符合条件就换位。大圈套小圈,尖朝上,改变内循环条件
4、数组的查找操作:折半查找
练习:有一个有序的数组,想要将一个元素插入到该数组中,还要保证该数组是有序的,如何获取该元素在数组中的位置?
class ArrayTest4{ //定义功能,获取key第一次出现在数组中的位置,如果返回是-1,那么代表该key在数组中不存在。 public static int getIndex(int[] arr,int key) { int min=0;//定义需要插入未知的初始化角标 for(int x=0; x<arr.length; x++) { if(arr[x]==key) return x; } return-1;//由于数组中不存在-1这个角标,因此返回-1则说明该数组中没有这个元素,即表示错误 } //折半查找:提高效率,但是必须要保证数组是有序的数组 public static int halfSearch(int[] arr,int key) { int min,max,mid; min= 0; max= arr.length-1; mid= (min+max)/2; while(arr[mid]!=key) { if(key>arr[mid]) min= mid+1; elseif(key<arr[mid]) max= mid-1; if(min>max) return -1; mid= (max+min)/2;//循环确定中间值的大小 } return mid; } //折半的第二种方式 public static int halfSearch_2(int[] arr,int key) { int min=0,max = arr.length-1,mid; while(min<=max) { mid= (min+max)/2; if(key>arr[mid]) min= mid+1; elseif(key<arr[mid]) max= mid-1; else return mid; } return -1; } public static void main(String[] args) { int[]arr = {3,5,6,7,8,9}; //int index = getIndex(arr,0); int index = halfSearch_2(arr,6); System.out.println("index="+index); }}
面试题:有一个有序的数组,想要将一个元素插入到该数组中,还要保证该数组是有序的,如何获取该元素在数组中的位置?
解答:可以通过折半查找的方法,确定需要插入的数的角标,继而将原本返回为-1的那句改成min即可
public static int halfSearch_2(int[]arr,int key) { int min=0,max = arr.length-1,mid; while(min<=max) { mid= (min+max)/2; if(key>arr[mid]) min= mid+1; elseif(key<arr[mid]) max= mid-1; else return mid; } return min;//返回的这个min就是需要插入的数的角标 }小结:
需要值得注意几点的是,在折半查找的方法中,首先就是需要确定要折半的数组是有序的,其次,在定义好一个标记key后,与折半的最大、小值相比较,继而突出折半的原理,而在查找的过程中,还需将中间值角标mid=(min+max)/2一次,防止出现死循环。
5、进制转换
class ArrayTest5{ public static void main(String[] args) { //toBin(6); toHex(60); } //十进制-->二进制public static void toBin(int num){//定义一个容器,用于存储数据StringBuffer sb = new StringBuffer();while(num>0){sb.append(num%2);//将num%2的值添加到容器中num = num/2;}System.out.println(sb.reverse);//将得到的数据反转} //十进制-->十六进制 publicstatic void toHex(int num) {//定义一个容器,用于存储数据 StringBuffer sb = new StringBuffer(); for(int x=0; x<8; x++)//由于取的是最低4位,而在十六进制中有4组八位,因此这里的x<8 { inttemp = num & 15;//之所以num&15,是为了得到其最低4位 if(temp>9) //System.out.println((char)(temp-10+'A')); sb.append((char)(temp-10+'A')); else //System.out.println(temp); sb.append(temp); num= num >>> 4;//无符号往右移4位 } System.out.println(sb.reverse()); }}
//查表法
class ArrayTest6{ public static void main(String[] args) { toHex(60); } /* 01 2 3 4 5 6 7 8 9 A B C D E F -->十六进制中的元素 01 2 3 4 5 6 7 8 9 10 11 12 13 14 15 查表法:将所有的元素临时存储起来,建立对应关系。 每一次&15后的值作为索引去查建立好的表,就可以找对应的元素。 这样比-10+‘A’简单得多 这个表该怎么建立呢?可以通过数据的形式来定义。 */ public static void toHex(int num) { char[]chs = {'0','1','2','3', '4','5','6','7', '8','9','A','B', 'C','D','E','F'}; //定义一个临时容器 char[]arr = new char[8]; int pos = arr.length; //for(intx=0; x<8; x++) while(num!=0) { int temp = num & 15; //System.out.println(chs[temp]); arr[--pos]= chs[temp]; num= num >>> 4; } //存储数据的arr数组遍历 for(int x=pos; x<arr.length; x++) { System.out.print(arr[x]+","); } }}//查表法
class ArrayTest6{ public static void main(String[] args) { //toHex(60); toBin(6); } /* 十进制-->二进制 */ public static void toBin(int num) { //定义一个二进制表 char[]chs = {'0','1'}; //定义一个临时容器 char[]arr = new char[32]; //定义一个操作数组的指针 int pos = arr.length; while(num!=0) { int temp = num & 1; arr[--pos]= chs[temp]; num= num >>> 1; } for(int x=pos; x<arr.length; x++) { System.out.print(arr[x]); } } /* 十进制-->十六进制 01 2 3 4 5 6 7 8 9 A B C D E F -->十六进制中的元素 01 2 3 4 5 6 7 8 9 10 11 12 13 14 15 查表法:将所有的元素临时存储起来,建立对应关系。 每一次&15后的值作为索引去查建立好的表,就可以找对应的元素。 这样比-10+‘A’简单得多 这个表该怎么建立呢?可以通过数据的形式来定义。 */ public static void toHex(int num) { char[]chs = {'0','1','2','3', '4','5','6','7', '8','9','A','B', 'C','D','E','F'}; //定义一个临时容器 char[]arr = new char[8]; int pos = arr.length; //for(int x=0; x<8; x++) while(num!=0) { int temp = num & 15; //System.out.println(chs[temp]); arr[--pos]= chs[temp]; num= num >>> 4; } //存储数据的arr数组遍历 for(int x=pos; x<arr.length; x++) { System.out.print(arr[x]+","); } }}
class ArrayTest7{ public static void main(String[] args) { //toBin(6); //toBa(60); toHex(60); } /* 十进制-->二进制 */ public static void toBin(int num) { trans(num,1,1); } /* 十进制-->八进制 */ public static void toBa(int num) { trans(num,7,3); } /* 十进制-->十六进制 */ public static void toHex(int num) { trans(num,15,4); } public static void trans(int num,int base,int offset) { if(num==0) { System.out.println(0); return; } char[]chs = {'0','1','2','3', '4','5','6','7', '8','9','A','B', 'C','D','E','F'}; char[]arr = new char[32]; intpos = arr.length; while(num!=0) { int temp = num & base; arr[--pos]= chs[temp]; num= num >>> offset; }//直接将pos的值赋值给x for(int x = pos; x<arr.length; x++) { System.out.print(arr[x]); } }}小结:在进制互转的过程中,指针很重要,为了让得到的数据时正着打印,这里可以定义一个pos指针,使其初始化值就为数组arr.length,继而让pos自减,即可得到一个正着打印的数组。
6、二维数组[][]
格式1:int[][] arr = new int[3][2];
解析:
(1)定义了名为arr的二维数组;
(2)二维数组中有3个一维数组
(3)每个一维数组中有2个元素
(4)一维数组的名称分别为arr[0],arr[1],arr[2]
格式2:int[][] arr = new int[3][];
(1)二维数组中有3个一维数组
(2)每个一维数组都是默认初始化值null
(3)可以对这个三个一维数组分别进行初始化
arr[0] = new int[3];
arr[1] = new int[1];
arr[2] = new int[2];
格式3:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};
(1)定义一个名称为arr的二维数组
(2)二维数组中有三个一维数组
(3)每一个一维数组中具体元素也都已初始化
arr[0] = {3,8,2};
arr[1] = {2,7};
arr[2] = {9,0,1,6};
(4)第三个一维数组的长度表示方式:arr[2].length;
class Array2Demo{ public static void main(String[] args) { /* int[]arr = new int[3];//一维数组 int[][]arr = new int[3][4];//定义了名称为arr的二维数组,二维数组中有 //3个一维数组,每一个一维数组中有四个元素。 int[]][]arr = new int[3][]; arr[0]= new int[3]; arr[1]= new int[1]; arr[2]= new int[2]; System.out.println(arr.length);//打印是二维数组的长度:3 System.out.println(arr[0].length);//打印二维数组中第一个一维数组长度 */ int[][]arr = {{1,4,5,6},{2,5,6,3},{77,8,5,4}}; int sum = 0; for(int x=0;x<arr.length; x++) { for(int y=0;y<arr[x].length; y++) { sum= sum+arr[x][y]; } } System.out.println("sum="+sum); }}
一维、二维数组的常见写法:
一维数组:int[] x; intx[];
二维数组:int[][] y; int y[][]; int[]y[];
详细请查看:http://edu.csdn.net
- 黑马程序员-Java基础知识-day04
- 黑马程序员--Java基础Day04
- 黑马程序员-day04-Java基础语法(数组)
- 黑马程序员 java学习笔记(day04)
- 黑马程序员 java 基础知识
- 黑马程序员---- java基础知识
- 黑马程序员 Java基础知识
- 黑马程序员-----JAVA基础知识
- 黑马程序员---Java基础知识
- 黑马程序员---java基础知识
- 黑马程序员 Java基础知识
- 黑马程序员-------java 基础知识
- 黑马程序员---java基础知识
- 黑马程序员 Java基础知识
- 黑马程序员-java基础知识
- 黑马程序员-Java基础知识
- 黑马程序员----------java基础知识
- 黑马程序员>>>java基础知识!
- JS中的数据类型
- JQuery中对option的添加、删除、取值
- c#操作xml
- JS确认提示框一句话解决
- 使用java.lang.Process类时需要注意的事情
- 黑马程序员-Java基础知识-day04
- bash 括号(小括号,双小括号,中括号,双中括号,大括号)
- Eclipse常用小技巧
- 双连通分量low的解释~
- vb吐槽班05 完了,这节目就这么毁了
- 87777777
- Android实现天气预报(中国天气网)
- c++ primer 学习笔记:类之类的声明和定义
- C++代码优化方法总结