黑马程序员——数组建立和操作

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

数组建立和操作
建立数组
<span style="font-size:14px;">class  ArrayDemo
{
	public static void main(String[] args) 
	{
		//元素类型[] 数组名 = new 元素类型[元素个数或数组长度];

		//需求:想定义一个可以存储3个整数的容器。
		int[] x = new int [3];
		
		System.out.println(x[1]);
	}
}</span>

数组的操作
<span style="font-size:14px;">class ArrayDemo2 
{
	public static void main(String[] args) 
	{
		//数组的操作:
		//获取数组中的元素。通常会用到遍历。
		//int[] arr = new int [3];
		int [] arr = {3,6,5,1,8,9,67};

		//数组中有一个属性可以直接获取到数组元素个数。length、
		//使用方法:数组名称.length = 
		/*
		System.out.println("length:"+arr.length);

		//int sum = 0;
		for (int x = 0; x<arr.length ;x++ )
		{
			//sum +=arr[x];
			System.out.println("arr["+x+"]="+arr[x]+";");
		}
		//System.out.println("sum="+sum);
			*/
		printArray(arr);
		//printArray(arr);
		System.out.println(arr);//输出了数组的地址:[I@15db9742

	}
	//定义功能,用于打印数组中的元素。元素间用逗号隔开。
	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]+"]");
		}
	}
}
</span>

数组的练习——最值的获取
获取数组中的最大值。
思路:
1,获取最值,需要进行比较。每一次比较都会有一个较大的值。因为该值不确定。
通过一个变量进行临时储。
2,让数组中的每一个元素都和这个变量中的值进行比较。
如果大于了变量中的值,就用该变量记录较大值。
3,当所有的元素都比较完成,那么该变量中存储的就是数组中的最大值了!


步骤:
1,定义变量。初始化位数组中任意一个元素即可。
2,通过循环语句对数组进行遍历。
3,通过变量过程中定义判断条件,如果遍历到的元素比变量中的元素大,就复制给该变量;


需要定义一个功能,一边提高复用性。
1,明确结果,数组中的最大元素 int[]。
2,未知内容:一个数组。int[].
<span style="font-size:14px;"><span style="font-size:14px;"><strong>class ArrayTest 
{
	
	public static int getMax( int [] arr)
	{
		int max = arr[0];
		for (int x =1; x<arr.length ;x++ )
		{
			if (arr[x]>max)
				max = arr[x];
		}
		return max;
	}
	/*
	获取最大值的另一种方式。
	可不可以降临时变量初始化为0呢?可以。这种方式,其实是在初始化维数组中的任意一个角标。
	*/
	public static int getMax_2( int [] arr)
	{
		int max = 0;
		for (int x =1; x<arr.length ;x++ )
		{
			if (arr[x]>arr[max])
				max = x;
		}
		return arr[max];
	}
	/*
	获取最小值
	*/
	public static int getMin(int [] arr)
	{
		int min = 0;
			for (int x = 1; x<arr.length ;x++ )
			{
				if(arr[x]<arr[min])
					min = x;
			}
			return arr[min];
	}

	public static void main(String[] args)
	{
		int [] arr = {5,1,6,4,2,8,9};
		int max = getMax_2(arr);
		int min =getMin(arr);
		System.out.println("max="+max);
		System.out.println("min="+min);
	}


}</strong></span></span>

练习二——数组的排序
<span style="font-size:14px;">class  ArrayTest2
{
	/*
	选择排序。
	内循环结束一次,最值出现头角标位置上。
	*/

	public static void selectSort(int[] arr)
	{
		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;
				*/
				swap(arr,x,y);
				}
			}
		}
	}
/*
冒泡循环
第一圈,最值出现在了最后一位!  
*/
	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);
	}
	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]+"]");
		}
	}
}
</span>

练习三——数组的查找操作
<span style="font-size:14px;">class  ArrayTest3
{
	public static void main(String[] args) 
	{
		//int [] arr = {3,2,1,5,4,2,9};
		//int index = getIndex(arr,7);
		//System.out.println("index="+index);
		
		
		int [] arr= {2,4,5,7,19,32,45};
		int index = getIndex_2(arr,8);
		System.out.println("index="+index);
	}
	//练习
	public static int getIndex_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;
			else if (key < arr[mid])
				max = mid-1;
			else
				return mid;
		}
		return min;//返回的min 就是8要插入的具体位置。
	}

	/*
	折半的第二种方式。
	*/
	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;
			else if (key < arr[mid])
				max = mid-1;
			else
				return mid;
		}
		return -1;
	}
	/*
	折半查找。提高效率,但是必须要办证该数组是有序的数组。
	*/
	public static int halfSearch(int [] arr, int key)
	{
		int min,max,mid;
		min = 0;
		max = arr.length-1;
		mid = (max+min)/2;

		while ((arr[mid]!=key))
		{
			if(key>arr[mid])
				min = mid + 1;
			else if(key < arr[mid])
				max = mid - 1;
			if (min>max)
				return -1;
			
			mid = (max+min)/2;

		}
		return mid;
	}




	//定义功能,获取key第一次出现在数组中的位置。如果返回时-1,那么代表 该key在数组中不存在。
	public static int getIndex(int [] arr, int key)
	{
		for (int x = 0; x<arr.length ;x++ )
		{
			if(arr[x] == key)
				return x;
		}
		return -1;
	}
}
</span>

练习四——进制转换
<span style="font-size:14px;">class  ArrayTest4
{
	public static void main(String[] args) 
	{
		//toBin(6);
		toHex(60);
	}



	/*
	十进制——>十六进制
	*/
	public static void toHex(int num )
	{
		StringBuffer sb = new StringBuffer();//数组容器,用于存储数据;

		for (int x = 0; x<8 ;x++ )
		{
			int temp = num & 15;
			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;
		}
		System.out.println(sb.reverse());
	}







	/*
	十进制——>二进制
	*/
	public static void toBin(int num)
	{
		while(num>0)
		{
			System.out.println(num%2);
			num = num / 2;
		}
	}
}
</span>

练习五——十六进制查表法
<span style="font-size:14px;">class ArrayTest5 
{
	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]);
		}


	}
	</span><span style="font-size:14px;">
	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;
		}
		System.out.println("pos="+pos);
		//储存数据的arr数组遍历。 
		for (int x = pos; x < arr.length ;x++ )
		{
			System.out.print(arr[x]+",");
		}
	}
}</span>
             0 1 2 3 4 5 6 7 8 9 A  B  C  D  E  F ==十六进制中的元素。
 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 


 查表法:将所有的元素临时存储起来。建立对应关系。
 每一次&15后的值作为索引去查建立好的表。就可以找对应的元素。
 这样比-10+‘A’简单的多。


 这个表怎么建立呢?
      可以通过数组的形式来定义。
 
 发现终于出结果了。但是是反着的。想要正过来呢?可以通过StringBuffer reverse 功能来完成。
 但是这个工具还没有学习。


 所以可以使用已经学习过的容器:数组来完成存储。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值