黑马程序员--Java学习06--数组

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

一、数组的概念

        所谓数组就是指相同数据类型的元素按照一定的顺序排列的集合,其实数组就是一个容器。

       由唯一确定摸个数组元素所需的下标个数可以将数组分为一维数组、二维数组、及多维数组。由于一位数组的使用频率最高,其次是二维数组,而多维数组的定义与使用可以通过二维数组导出,因此,下面仅介绍一维数组和二维数组的定义、创建、初始化和访问的基本方式。

1、一维数组

      所谓一维数组是指每个元素由一个下标值唯一确定的数组类型。

      一维数组的定义:

     数组元素类型[] 数组型变量名;
     数组元素类型 数组型变量名[];


     其中,“数组元素类型”为组成一维数组的元素类型,“数组型变量名”为定义的数组型变量名称,它应符合Java语言的标识符命名规则,建议遵守Java语言的标识符命名规范;例如


int[] intArray; 或者 int intArray[];
float[] floatArray; 或者 float floatArray[];

      一维数组的创建

       数组型变量属于引用类型,即内部存储的是与引用数组有关的信息,而数组本省需要利用new运算符创建。下面是利用new 运算符创建数组的语法格式:

     new 数组元素类型[数组元素数目];

例如:

intArray = new int[100];
floatArray = new float[50];

也可以将数组的定义与创建合并在一起。例如:

char[] name = new char[30];
int[] intArray = new int[50];
float floatArray = new float[50];

       需要注意的是:Java语言与C/C++语言就数组类型的实现而言有一个根本的区别,就是Java中的数组只能动态的创建且动态分配内存空间,这是人们最初使用Java语言时经常容易忽略的一个问题。另外,数组一旦被创建就无法改变其长度,如果经常需要在程序运行过程中扩展数组的长度,就应该使用数组列表(ArrayList)。

        一维数组的初始化

      在创建数组的同时,为数组元素赋予初始值的过程被称为数组的初始化。在Java语言中,为一维数组初始化的基本格式为:

int[] intArray = {10,20,30,40,50,60,70,80,90,100};

       这句话的操作过程是:首先为intArray数组分配10个int型元素所需要占用的存储空间,然后将初始值 10,20,30,40,50,60,70,80,90,100依次赋给intArray[0]~intArray[9]。


     一维数组的访问

     与C/C++语言相同,Java访问数组元素的格式为:

     arrayname[下标表达式]

2、二维数组

     二维数组的定义有以下几种方式:

    数组元素类型 数组名字[][];例如 int arr[][];
    数组元素类型[][] 数组名字;例如 int[][] arr;


     二维数组的创建如下:

 

//定义一个4行,5列的整型数组
int[][] intArray = new int[][]{{1,6,5,4,2},{7,8,2,4,6},{-1,5,2,4,9},{4,2,3,6,-9}};
或者
int[][] arr ={{1,6,5,4,2},{7,8,2,4,6},{-1,5,2,4,9},{4,2,3,6,-9}};

二、数组的应用


例:数组的遍历

//定义功能:输出数组中每个元素
方法一
class PrintArray {
 PrintArray(int[] arr){
  for (int i=0;i<arr.length ;i++ ) {
   System.out.print(arr[i]);
  }
 }
}
方法二
class PrintArray {
 PrintArray(int[] arr){
  for (int x:arr) {
   System.out.print(x);
  }
 }
}


例:定义一个二维int数组,编写代码获取最小元素。

/**
 * 例:定义一个二维int数组,编写代码获取最小元素。
 * @author wy_heima
 * 解题思路:
 * 1、定义一个二维数组。
 * 2、定义一个容器用于存放最小值。
 * 3、将数组中的一个值先放到容器内,然后将数组中的其它值依次和容器中的值进行比较,若比容器中的值小,则覆盖容器中的值。
 * 4、输出结果。
 * */
public class Test {
	
	public static void main(String[] args) {
		
		//定义一个4行,5列的二维数组
		int[][] arr ={{1,6,5,4,2},{7,8,2,4,6},{-1,5,2,4,9},{4,2,3,6,-9}};
		
		//输出二维数组
		System.out.println("二维数组arr是:");
		printArray(arr);
		
		//输出二维数组最小值
		System.out.println("二维数组arr的最小值是:"+getMin(arr));
	}
	
	
	//定义int型方法用于返回数组arr的最小值
	private static int getMin(int[][] arr) {
		
		//定义int变量用于存放最小值
		int temp;
		
		//将二维数组的第一个数赋给temp
		temp=arr[0][0];
		
		//定义for循环,将数组中其它值和temp值相比较,最后得出最小值
		for(int i=1;i<arr.length;i++) {
			
			for(int j=0;j<arr[i].length;j++) {
			
				if(temp>arr[i][j]) temp=arr[i][j];
				}							
		}	
		//返回最小值
		return temp;		
	}
	
	//定义一个方法用于输出数组各元素
	static void printArray(int[][] arr) {
		
		System.out.print("{");
		
		for(int i=0;i<arr.length;i++) {
			
			System.out.print("{");
			
			for(int j=0;j<arr[i].length-1;j++) {
			
				System.out.print(arr[i][j]+",");		
				}
			
			System.out.print(arr[i][arr[i].length-1]+"}");
		}
		System.out.println("}");
	}
}

输出结果是:-9

例:获取数组中重要元素的下标

class ArraySreach_1 {

	public static void main(String[] args) {

		int[] arr={1,3,5,6,7,8,9};
		int index=getIndex(arr,9);//获取元素9的下标
		System.out.println("index="+index);
	}

	/**
		定义功能:获取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;
	}

}


上面这种查找方法效率低,对于含有较多元素的数组就显得慢了,下面介绍折半查找法:

class ArraySreach_2 {

	public static void main(String[] args) {

		int[] arr={1,3,5,6,7,8,9};
		int index_1=halfSearch_1(arr,9);
		int index_2=halfSearch_2(arr,9);//获取元素9的下标
		System.out.println("index_1="+index_1);
		System.out.println("index_2="+index_2);
	}

	/*
	折半查找,提高效率,但是必须要求原数组有序;
	折半查找的基本思路:
	1、设arr[min .... max]是当前的查找区间,首先确定该区间的中间位置mid=(min+max)/2;
	2、然后将待查的key值与arr[mid]比较,若相等,则查找成功,并返回该位置;否则需确定新的查找区间。
	3、若arr[mid]>key,则由表的有序性可知arr[mid....max]均大于key,因此若表中存在关键字等于key的记录,则该记录必定是在mid左边的
	   字表arr[min....mid-1]中,故新的查找区间是左子表
	4、类似的,若arr[mid]<key,则要查找的key必在mid的右子表arr[mid+1.....max]中,即新的查找区间是右子表arr[mid+1...max].
	5、循环以上步骤,直到子区间的长度小于1时查找结束。
	*/
	public static int halfsearch_1(int[] arr,int key) {

		int min=0,max=arr.length-1,mid;
		mid=(min+max)/2;
		while(arr[mid]!=key) {

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

	/**
	折半查找的另一种方法
	*/
	public static int halfsearch_2(int[] arr,int key) {

		int min=0,max=arr.length,mid;
		mid=(min+max)/2;
		while (min<=max) {//与上一个的不同之处,此处的约束条件不同
		
			if(arr[mid]>key) max=mid-1;
				
			if(arr[mid]<key) min=mid+1;
				
			if(arr[mid]==key) return mid;
				
			mid=(min+max)/2;
		}
		return -1;
	}

}

下面介绍排序选择排序和冒泡排序法:

/**
选择排序思想:从头至尾顺序扫描序列,找出最小的一个记录,和第一个记录交换,接着从剩下的记录中继续这种选择和交换,最终使序列有序。
*/
import java.util.Arrays;
class ArraySort {
	
	public static void main(String[] args) {
		
		//定义一个待排序数组
		int[] arr={1,2,3,3,5,0,6,8,9,2,4,1,6,4,0,6,7,4,3};
		//数组的操作最常见的是获取数组中的元素。
		//数组中有一个属性可以直接获取到数组中元素个数:.length.
		//使用方法:数组名称.length

		//输出排序前数组
		printArray(arr);

		//选择排序
		selectSort(arr);

		//输出排序后数组
		printArray(arr);
	}


	/**
	选择排序
	*/
	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;
				}
			}
		}
	}

	//输出数组
	public static void printArray(int[] arr) {

		for(int x=0;x<arr.length;x++) {

			System.out.print(arr[x]+" ");
		}
		System.out.println();
	}
}
/**
冒泡排序
思想原理:
1、相邻的两个数相比较,经过轮的比较,最大的数据肯定会位于最后;
2、经过循环,若某一轮的比较中没有移动数据说明序列已经有序,此时可以结束循环
步骤:
1、定义变量,进行初始化;
2、通过循环语句对数组进行遍历;
3、在变量的过程中定义判断条件,如果前一个比后一个大,调换两者位置,如果在某一次循环中并未调换,说明数组已经有序,跳出循环。
	
*/
import java.util.Arrays;
class ArraySort {
	
	public static void main(String[] args) {
		
		//定义一个待排序数组
		int[] arr={1,2,3,3,5,0,6,8,9,2,4,1,6,4,0,6,7,4,3};
		

		//输出排序前数组
		printArray(arr);

		//选择排序
		bubbleSort(arr);

		//输出排序后数组
		printArray(arr);
	}

	//冒泡排序
	public static void bubbleSelect(int[] arr)
	{
		
		w:for(int x=arr.length-1;x>0;x--)
		{	
			int cnt=0;
			q:for(int y=0;y<x;y++)
			{
				if(arr[y]>arr[y+1])
				{
					int temp=arr[y];
					arr[y]=arr[y+1];
					arr[y+1]=temp;
					cnt=1;
				}
			}
			if(cnt==0)
				break w;
		}
	}

	//输出数组
	public static void printArray(int[] arr) {

		for(int x=0;x<arr.length;x++) {

			System.out.print(arr[x]+" ");
		}
		System.out.println();
	}
}

下面介绍进制转换:

/**
练习十进制、二进制、八进制、十六进制之间的转换 
*/

class ArrayTest {

	public static void main(String[] args) {
		
		//将-6转化成二进制
		toBin(-6);
		
		//将-19转化成八进制
		toOxx(-19);

		//转化成十六进制
		toHex(-127);
		toHex_(-60);

	}

	//十进制转二进制
	public static void toBin(int num) {

		if(num==0) {

			System.out.print(0);
			return ;
		}
		StringBuffer sb=new StringBuffer();//定义容器存放得出的0,1数据
		while (num!=0) {

			sb.append(num%2);
			//System.out.print(num%2);
			num=num >>> 1;
		}
		System.out.println(sb.reverse());
	}


	//十进制转八进制
	public static void toOxx(int num) {

		if(num==0) {

			System.out.print(0);
			return ;
		}
		StringBuffer sb_=new StringBuffer();

		while (num!=0){//for(int x=0;x<10;x++)
		
			sb_.append(num & 7);
			num=num >>> 3;
		}
		System.out.println(sb_.reverse());
	}

	//十进制转十六进制
	public static void toHex(int num) {

		if(num==0) {

			System.out.print(0);
			return ;
		}
		StringBuffer sb_=new StringBuffer();
		while (num!=0) {

		//for(int x=0;x<8;x++)
			if ((num & 15)>9) {

				sb_.append((char)((num & 15)-10+'A'));
			}
			else 
				sb_.append(num & 15);
			
			num=num >>> 4;
		}
		System.out.println(sb_.reverse());
	}


	//查表法
	public static void toHex_(int num) {
		if(num==0) {

			System.out.print(0);
			return ;
		}
		char[] ch={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
		StringBuffer sb_=new StringBuffer();
		while (num!=0) {
		//for(int x=0;x<8;x++)

			sb_.append(ch[num & 15]);
			
			num=num >>> 4;
		}
		System.out.println(sb_.reverse());
	}
}










---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值