黑马程序员_java基础day04

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

主要内容:一数组、二 数组排序(选择、冒泡)、三 数组查找(折半)、四 进制转换、五 二维数组

一、数组的定义
    概念:同一种类型数据的集合。其实数组就是一个容器。
    数组的好处:
可以自动给数组中的元素从0开始编号,方便操作这些元素。
    格式1:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例:int[] arr = new int[5];
    格式2:
元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};
    数组的两个常见异常:
ArrayIndexOutOfBoundsException: 3:操作数组时,访问到了数组中不存在的角标。
NullPointerException:空指针异常:当引用没有任何指向值为null的情况,
该引用还在用于操作实体。
打印数组中的元素,通常会用到遍历。

	class ArrayDemo
	{
		public static void main(String[] args)
		{
			int[] arr = {4,3,2,6,5,7,8}
			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]+"]"0);
			}
		}
	}
获取数组中的最值
class ArrayTest 
{
	public static void getMax(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 void main(String[] args) 
	{
		int[] arr = {4,4,7,8,9,3,5};
		int max = getMax(arr);
		System.out.println("max="+max);
	}
}

二、对给定数组排序。
1,选择排序。
选择排序每次都是找一个固定的元素和其他元素相比,
第一圈结束后,最值出现在头角标位置上。

	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;
				}
			}
		}	
	}

2,冒泡排序。
思路:冒泡排序每轮排序都是相邻元素之间进行比较,第一圈结束后最值出现在了最后位置上。
每轮排序结束后,下一轮比较都会减少一个元素。代码如下:

	public static void bulbbleSort(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;
				}
			}
		}
	}
3,真实开发中用到的排序,java已经提供好了

	import java.util.*;
	{
		Arrays.sort(arr);
	}
三、数组的查找操作。
1,顺序查找。

		public static void main(String[] args)
		{
			int[] arr = {4,7,6,8,9,3,5};
			int index = getIndex(arr,3);
			System.out.println("index="+index);
		}
		//定义功能,获取key第一次出现在数组中的位置。如果返回-1,代表该key在数组中不存在。
		public static void getIndex(int[] arr,int key)
		{
			for(x=0;x<arr.length;x++)
			{
				if(arr[x]==key)
					return x;
			}
			return -1;
		}

2,折半查找。可以提高效率,但是必须保证数组是有序的。

		public static void main(String[] args)
		{
			int[] arr = {4,5,6,8,9,11,13};
			int index = halfSearch(arr,11);
			System.out.println("index="+index);
		}
		public static void halfSearch(int[] arr,int key)
		{
			int min=0,max=arr.length-1,mid;
			while (min<max)
			{
				mid = (max+min)>>1;//相当于除以2
				if(key>arr[mid]
					min = mid+1;
				else if(key<arr[mid])
					max = mid-1;
				else
					return min;
			}
			return -1;
		}

四、用数组实现十进制转二进制、八进制、十六进制示例
十进制转换其他进制,需要明确3个数据。num被转换的十进制数,base是&上的基数。
offset右移的位数。

	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];
		int pos = arr.length;//定义一个指针等于数组的长度,从数组角标最后位置存储。
		while (num!=0)
		{
			int temp = num&base;//base是转换的基数
			arr[--pos] = chs[temp];
			num = num >>>offset;//offset右移位数
		}
		for(int x=pos;x<arr.length;x++)//从有效位遍历
		{
			System.out.print(arr[x]);
		}
	}
	十进制-->二进制
		public static void toBin(int num)
		{
			trans(num,1,1);//二进制,&上1,每次右移1位
		}
	十进制-->八进制
		public static void toBa(int num)
		{
			trans(num,7,3);//八进制,&上7,每次右移3位
		}

	十进制-->十六进制
		public static void toHex(int num)
		{
			trans(num,15,4);//十六进制,&上15,每次右移4位
		}
五、二维数组[][]
    格式1:int[][] arr = new int[3][2];
定义了名称为arr的二维数组
二维数组中有3个一维数组
每一个一维数组中有2个元素
一维数组的名称分别为arr[0],arr[1],arr[2]
给第一个一维数组1角标赋值为78的写法是:arr[0][1]=78;


    格式2:int[][] arr = new int[3][];
 二维数组中有3个一维数组
 每个一维数组都是默认初始化值null
 可以对这三个一维数组分别进行初始化
 arr[0] = new int[3];
 arr[1] = new int[1];
 arr[2] = new int[2];









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值