黑马程序员——数组操作

                                                                             ---------------------- android培训、java培训、期待与您交流! ---------------------- 



一丶数组

   1、定义:同一种类型数据的集合,其实数组就是一个容器。引用类型,默认初始化值是:null


   2、格式:①元素类型[] 数组名=new 元素类型[元素的个数或者长度];----int[] arr=new int[5];
                     ②元素类型[] 数组名=new 元素类型[]{元素,元素,元素,......};----int[] arr=new int[]{1,3,3,4};||int[] arr={1,3,3,4};


   3、二维数组:数组中的数组,例如我们可以再在数组中存取元素,那么我们把数组当做元素存进数组中,就成为了二维数组。

         ①int[][] y;int[] y[];int y[][];都正确都是二维数组,int[] x,y[];----x是一维数组,y是二维数组

         ②二维数组示例:

class Array2Demo
	{
		public static void main(String[] args)
		{
			int[][] arr=new int[3][4];//定义了名称为arr的二维数组,二维数组中有3个一维数组,每一个一维数组中有四个元素。
		}
		
	}


二丶数组异常代码示例:

class Array1 
{
	public static void main(String[] args) 
	{
		int[] arr=new int[3];
		System.out.println(arr[3]);
		//ArrayIndexOutOfBoundsException: 3:操作数组时,访问到了不存在的角标。
		int[] ar=new int[3];
		ar=null;
		System.out.println(ar[1]);
		//NullPointerException:空指针异常。
		//javac编译没有错误提示是因为:编译时还没有进行new,编译检测语法错误,而上面所述没有语法错误!
	}
}


三丶数组的一些常见操作:

   1、for循环遍历数组,获取长度:数组名.length


   2、获取最值:①遍历每一个值比较大小

                             ②遍历每一个角标比较


   3、数组的排序:

         ①选择排序示例:固定一个,让其和其他所有比较,比较完成,进行第二次比较!

public class Array2
	{
	/*
	分析:假如int[] arr={5,1,6,4,2,8,9};,则第一次固定‘5’和其他数比较,一共5次;第二次固定‘2’角标上面的数’和后面的数比较,一共4

次......
	那么总体下来就是:
	*****----第一次
	****----第二次
	***----第三次
	**----第四次
	*----最后一次(不用比较了)
	由前面学到的可以知道:箭头朝下,则改变初始化值,让其随外循环变化
	*/
		public static void selectSort(int[] arr)
		{
			//有分析可见:利用循环嵌套,定义外循环控制比较次数
			for(x=0;x<arr.length-1;x++)
			{
				//定义内循环,控制数组元素的交换,排列
				for(y=x+1;y<arr.length;y++)
				{
					if(arr[x]>arr[y])
					int temp;//定义第三变量,进行数组交换
					temp=arr[x];
					arr[x]=arr[y];
					arr[y]=temp;
					//swap(arr,x,y);
				}
			}
		}
		public static void main(String[] args)
		{
			int[] arr={5,1,6,4,2,8,9};
			selectSort(arr);
			//for循环打印出数组,打印代码省略
		}
	}

         ②冒泡排序示例:相邻的两个元素进行比较,如果符合条件进行换位;这样第一次换位比较能找出最大值且第二次比较不用参与                                          比较放置,到最后一个角标上,第二次比较找出第二个最大值不用参与第三次比较放置到倒数第二个角标上

                                         以此类推(这是从小到大排)由此可见也是嵌套循环

public class Array3
	{
		public static void selectSort(int[] arr)
		{
			for(int x=0;x<arr.length-1;x++)
			{
				由上面的分析可见,内循环遍历比较,每一次都会少一次比较,所以“-x”
				for(int y=0;y<arr.length-x-1;y++)//-1:避免角标越界,如果不减1,最后一次执行y+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);
					}
				}
			}
		}
		有上面可见,排序时,需要换位置,代码重复,则定义函数进行换位置操作,不确定的内容有三:需要换位置的2个数,和数组

所以如下
		public static void swap(int[] arr,int a,int b)
		{
			int temp=arr[a];
			arr[a]=arr[b];
			arr[b]=temp;
		}
	}

   4、实际开发中用到的排序方法:Array.sort(arr);调用这一个功能,会进行自动排序


   5、数组的查找:折半查找

class Array4
	{
		public static void main(String[] args)
		{
			//int[] arr={3,2,4,5,9,8,2};//如果数组中有重复的数值,则查找时以第一个为准
			//int index=getIndex(arr,8);
			int[] arr={2,4,5,7,19,32,45};//有序的数组
			//int index=halfSearch_2(arr,5);
			int index=getIndex_2(arr,8);
			System.out.println("index="+index);
		}
		/*
		折半查找,提高效率,但是要保证数组是有序的,折半查找:例如一个数在1-100之间,从50猜这个数,如果比50大则1-50就不

用要了,只猜后面51-100,以此类推....
		*/
		public static vodi halfSearch(int[] arr,int key)
		{
			int min=0;
			int max=arr.length-1;
			int mid=(min+max)/2;
			while(arr[mid]!=key)
			{
				if(key>arr[mid])
					min=mid+1;
				else if
					max=mid-1
				if(min>max)//一直折半,如果查找的数不存在,那么会出现:min>max,这时不需要折半,返回-1表示没有找到

该数据
					return -1;
				mid=(min+max)/2;
			}
			return mid;
		}


		/*
		折半查找的另一种方法
		*/
		public static void halfSearch_2(int[] arr,int key)
		{
			int min=0,max=arr.length-1,mid;
			
			while(min<=max)//“<=”是因为,如果数组是一个数,那么min和max相等
			{
				mid=(max+min)>>1;
				if(key>arr[mid])
					min=mid+1;
				else if(key<arr[mid])
					max=mid-1;
				else
					return mid;
			}
			return -1;
		}


		/*
		有一个有序的数组,现在将一个数插入进数组,还要保证数组插入后是有序的!
		*/
		public static int getIndex_2(int[] arr,int key)
		{
			//假如插入一个数:8
			int min=0,max=arr.length-1,mid;
			
			while(min<=max)//“<=”是因为,如果数组是一个数,那么min和max相等
			{
				mid=(max+min)>>1;
				if(key>arr[mid])
					min=mid+1;
				else if(key<arr[mid])
					max=mid-1;
				else
					return mid;
			}
			return min;

		}



		public static int getIndex(int[] arr,int key)//key代表要查找的数,数组和要查找的数都不确定,所以定义参数!
		{
			//循环遍历查找数组中时候有该数值
			for(int x=0;i<arr.length;x++)
			{
				if(arr[x]=key)
				return x;
			}
			return -1;//如果没有查找到该key,说明不存在,数组是从0角标开始,返回-1代表无该数值
		}
	}



                                                             ---------------------- android培训、java培训、期待与您交流! ----------------------


                                                                                            详细请查看:http://edu.csdn.net/heima

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值