黑马程序员——数组

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

数组
概述:相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。
特点

  • 1.数组是相同数据类型的元素的集合。
  • 2.数组中的各元素是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。
  • 3.数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,以此类推。

数组定义

1.静态定义:定义的数组能有合适的长度 格式:格式:元素类型[] 数组名={元素,元素,元素}。
2.动态定义:定义数组时不能指定其长度(数组中元素的个数),Java中使用关键字new创建数组对象,格式为:数组名 = new 数组元素的类型 [数组元素的个数]。

数组初始化

  • 1.动态初始化:数组定义与为数组分配空间和赋值的操作分开进行。
  • 2.静态初始化:在定义数字的同时就为数组元素分配空间并赋值。
  • 3.默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐士初始化。

常见的数组操作方法

1.取最小值、最大值

package Array;
public class ArrayMaxMin
{
	public static int min(int[] arr) //取数组中的最小值。
	{
		int min = 0; //定义接受最小值的变量。
		for(int i=0; i<arr.length; i++) //遍历数组,遍历到的位置上的元素如果比min小就把值赋给min。
		{
			if(min>arr[i])
				min=arr[i];
		}
		return min; //遍历结束返回最小值。
	}
	public static int max(int[] arr) //取数组中的最大值。
	{
		int max = 0; //定义接受最大值的变量。
		for (int i = 0; i < arr.length; i++) //遍历数组,遍历到的位置上的元素如果比max大就把值赋给max。
		{
			if(max<arr[i])
				max = arr[i];
		}
		return max; //遍历结束返回最大值。
	}
	public static void main(String[] args)
	{
		int[] arr = {-1,2,4,-3,-5,10};
		System.out.println(max(arr));
		System.out.println(min(arr));
	}
}

2.对数组进行排序

package Array;
public class ArraySort
{
    public static int[] sort_1(int[] arr)  //选择排序,首先把下标1位置的元素与依次与其他位相比,如果小于下标1位置上的元素就把两个位置的元素换。
    {
    	for(int i=0; i<arr.length-1; i++) //每次循环依次就把i位置上的数确定好了。
    	{
    		for (int j = i+1; j < arr.length; j++) 
			{
				if(arr[i]>arr[j])
				{
					swap(arr, j, i);  //交换两个位置上的元素。
				}
			}
    	}
    	return arr;
    }
    public static int[] sort_2(int[] arr) //冒泡排序是把相邻的两个元素进行比较,如果前者大于后者就互换位置。
    {
    	for(int i=0; i<arr.length-1; i++)
    	{
    		for(int j=0; j<arr.length-i-1; j++)
    		{
    			if(arr[j]>arr[j+1])
    			{
    				swap(arr, j, j+1); //交换两个位置上的元素。
    			}
    		}
    	}
    	return arr;
    }
	public static void swap(int[] arr, int a, int b) //交换元素。
	{
		int tem = arr[a];
		arr[a] = arr[b];
		arr[b] = tem;
	}
    public static void sop(int[] arr) //打印排序后的数组。
	{
		System.out.print("{");
		for (int i = 0; i < arr.length; i++)
		{
			if(i==arr.length-1)
				System.out.println("}");
			else
				System.out.print(arr[i]+",");
		}
	}
    public static void main(String[] args)
	{
		int[] arr = {-1,3,-4,10,5,-6,9};
		sop(sort_1(arr));
		sop(sort_2(arr));
	}
}

3.修改数组元素

package Array;
public class ArratModify
{
	public static int halfSearch(int[] arr, int key) //利用折半查找找到元素要插入的位置
	{
		int min = 0;
		int max = arr.length-1;
		int mid;
		while(min<=max) //如果最小值大于最大值结束循环。
		{
			mid = (min+max)>>1;  //折半运算
			if(key>arr[mid]) //如果折半位置上的数小于插入值,min就等于mid+1。
				min = mid +1;
			else if(key==mid) //如果折半位置上的数等于插入值,就返回mid。
				return mid;
			else   //如果折半位置上的数大于插入值,max就等于mid-1。
				max = mid-1; 
			
		}
		return min;
	}
	public static int[] addelement(int[] arr, int value)  //添加元素,指定添加到末尾 数组:arr、插入值:value。
	{
		int[] arrs = new int[arr.length+1]; //创建一个新的数字,是来接收原来数组和插入值新组成的数组,所以长度比原来数组长1.
		for (int i = 0; i < arrs.length; i++)
		{
			if(i==arrs.length-1)  //新数组最后的值为插入值。
				arrs[arrs.length-1] = value;
			else
				arrs[i] = arr[i];
		}
		return arrs;
	}
	public static int[] addelement(int[] arr, int pos, int value) //添加元素到数组的指定位置 数组:arr、插入位置:pos、插入值:value。
	{
		if(pos==arr.length) //插入位置为数组最后一位,就直接调用第一个添加元素方法。
			return addelement(arr, value);
		else if(pos>arr.length) //插入位置在数组不存在,就插入失败返回原数组。
		{
			System.out.println("插入失败:插入的位置不存在!");
			return arr;
		}
		else //插入位置在数组存在并不是最后一位。
		{
			int[] arrs = new int[arr.length+1]; //定义新的数组用来接收插入值和原来数组新组成的数组。
			for (int i = 0; i < arr.length; i++) //循环遍历原来数组。
			{
				if(i<pos) //遍历位置小于插入位置,就按原来的顺序在新的数组加入原数组的通顺序的元素。
					arrs[i] = arr[i];
				else if(i==pos) //遍历位置等于插入位置,把插入值放入遍历位置,并把原数组的遍历位置上的值放到新数组的遍历位置+1上。
				{
					arrs[i+1] = arr[i];
					arrs[i] = value;
				}
				else //遍历位置大于插入,把原数组的遍历位置上的值放到新数组的遍历位置+1上。
					arrs[i+1] = arr[i];
			}
			return arrs;
		}
		
	}
	public static int[] addelement(int[] arr, int value,boolean isOrder) //添加元素到有序数组中,添加后,保证数组还是有序,数组:arr、插入值:value、是否有序:isOrder。
	{
		if(isOrder==false)
			return addelement(arr, value); //无序的话就直接调用添加元素到到末尾。
		else 
			return addelement(arr, halfSearch(arr, value),value); //有序的,就先调用halfSearch找到插入位置,把这个插入位置当参数传入addelement(int[] arr, int pos, int value)即可。
	}
	public static void sop(int[] arr)
	{
			System.out.print("{");
		for(int i=0;i<arr.length;i++)
		{
			if(i==arr.length-1)
				System.out.println(arr[i]+"}");
			else
				System.out.print(arr[i]+",");
		}
	}
	public static int[] modifyelement(int[] arr, int pos, int value) //修改指定位置的元素,如果指定位置不存在修改失败,数组:arr、修改位置:pos、修改值:value。
	{
		if(0<=pos&&pos<arr.length)
		{
			arr[pos] = value; //把指定的上的值改为修改值。
			return arr;
		}
		System.out.println("修改失败:修改元素位置不存在!");
		return arr;
	}
	public static int[] deleteelement(int[] arr) //删除全部元素。
	{
		return arr = null;
	}
	public static int[] deleteelement(int[] arr, int pos) //删除指定位置上的元素,数组:arr、删除位置:pos。
	{
		if(pos<0 || pos>arr.length-1) //删除位置不是在0~数组下标最大值之间,就删除失败。
		{
			System.out.println("删除失败:删除位置在数组中不存在!");
			return arr;
		}
		else 
		{
			int[] arrs = new int[arr.length-1]; //定义新的数组接受删除了一个元素的原数组。
			for (int i = 0; i < arrs.length; i++)
			{
			if(i<pos)
				arrs[i] = arr[i]; //当遍历位置小于删除位置,新的数组按原数组顺序添加元素。
			else
				arrs[i] = arr[i+1]; //当遍历位置大于或等于删除位置,把删除位置后面的数放到新的数组中。
			}
		return arrs;
		}
			
		
	}
	public static int[] deleteelement(int value, int[] arr) //删除数组中的指定元素,数组:arr、指定值:value。
	{
		if(select(value, arr)==true) //判断数组中有没有此值,没有就删除失败。
		{
			return deleteelement(arr, select(arr, value)); //用select方法返回指定元素的位置,然后用删除指定位置元素的方法删除元素。
		}
		else
		{
			System.out.println("删除失败:删除元素在数组中不存在!");
			return arr;
		}
	}
	public static int select(int[] arr, int key) //得到指定数在数组中的位置的函数。
	{
		for(int i=0; i<arr.length; i++)
		{
			if(arr[i]==key)
				return i;  //数组中有此元素就返回此元素的位置。
		}
		return -1; //数组中没有此元素就返回-1.
	}
	public static Boolean select(int key, int[] arr) //重载select方法判断指定数是否在数组中存在的函数。
	{
		if(select(arr, key)>=0) //调用select(int[] arr,int key),返回-1就代表数组中没有此元素,返回大于或等于0的数就表示数组有此元素。
			return true;  //select(int[] arr,int key返回大于或等于0的数此函数就返回true,返回-1就返回false。
		return false;
	}
	public static void main(String[] args)
	{
		int[] arr = {1,2,3,4};
		sop(addelement(arr,9));
		sop(addelement(arr,1,9));
		sop(addelement(arr, 4, true));
		sop(modifyelement(arr,3,3));
		sop(deleteelement(arr, 2));
		sop(deleteelement(1, arr));
	}
}

4.比较数组元素大小

package Array;
public class ArrayEquals
{
	public static int equals(int[] arr, int pos, int key) //比较一个数与数组中指定位置元素的大小,pos:指定数组中的元素位置,key:比较数。
	{
		if(arr[pos]>key)
			return 1; //如果数组中指定位置的元素大于比较数,就返回1.
		else if(arr[pos]==key)
			return 0; //如果数组中指定位置的元素等于比较数,就返回0。
		else
			return -1; //如果数组中指定位置的元素小于比较数,就返回-1.
	}
	public static void main(String[] args)
	{
		int[] arr = {-1,-4,7,9,-2,10};
		System.out.println(equals(arr, 3, 10));
	}
}</span>



5.十进制转其他进制

<span style="font-size:14px;">package Array;
public class ArrayHex
{
	public static void trans(int value, int hex, int offest)
	{
		char[] ch = {'0','1','2','3','4','5','6','7'
				,'8','9','A','B','C','D','E','F'}; //建立进制表,包含了2进制、8进制、16进制的所有进制数。
		char[] arr = new char[32]; //最长的2进制就是32位,定义一个32的字符数组。
		int temp = arr.length; 
		while(value!=0) //只要值不为0就做value&hex运算。
		{
			int i = value & hex;
			arr[--temp]= ch[i];  //把i对应的进制表的值赋给字符数组。
			value = value>>>offest; //每循环一次就向右偏移offest位。
		}
		for( int i=temp;i<arr.length; i++) //循环跳出的时候tem前面的数全为0,从tem开始编译字符数组可以去掉前面的0。
		{
			System.out.print(arr[i]);
		}
	}
	public static void toBiny(int value)
	{
		trans(value, 1, 1);	 //2进制是value & 1运算,每次循环向右偏移1位。
		System.out.println();
	}
	public static void toEight(int value)
	{
		trans(value, 7, 3);	//8进制是value & 7运算,每次循环向右偏移3位。
		System.out.println();
	}
	public static void toHex(int value)
	{
		trans(value, 15, 4); //16进制是value & 15运算,每次循环向右偏移4位。	
		System.out.println();
	}
	public static void sop(int[] arr)
	{
		for (int i = 0; i < arr.length; i++)
		{
			System.out.print(arr[i]);
		}
	}
	public static void main(String[] args)
	{
		toBiny(60);
		toEight(60);
		toHex(60);
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值