zoukankan      html  css  js  c++  java
  • Java 基础入门随笔(6) JavaSE版——数组操作

    1.数组

      概念:同一种类型数据的集合。其实就是数组就是一个容器

      好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。

      格式:

      ①. 元素类型[] 数组名 = new 元素类型[元素个数或数组长度];  例:int[] arr = new int[5];

      ②.元素类型[] 数组名 = new 元素类型[]{元素,元素,....};  例:int[] arr = new int[]{3,5,1,7}; 或者 int[] arr = {3,5,1,7};

      常见异常:

      ①.ArrayIndexOutOfBoundsException:  //当访问到数组中不存在的索引时,就会发生该异常。

      ②.NullPointerException:  //当引用型变量没有任何实体指向指向时,还在用其操作实体。就会发生该异常。

      ③.[I@c17164  //哈希数地址,@左边部分是实体的类型,这里代表整型数组;@右边是实体的哈希值。

    2.数组常见操作

      ①.获取最值(最大值,最小值)

    //方法一:值比较
    public static int getMax(int[] arr)
    {
    	//定义变量记录较大的值。
    	int maxElement = arr[0];//初始化为数组中的任意一个元素。
    	for(int x=1; x<arr.length; x++)
    	{
    		if(arr[x]>maxElement)
    				maxElement = arr[x];
    	}
    	return maxElement;
    }
    
    //方法二:索引比较
    public static int getMax_2(int[] arr)
    {
    	//定义变量记录较大的值。
    	int maxIndex = 0;//初始化为数组中任意一个角标。
    	for(int x=1; x<arr.length; x++)
    	{
    		if(arr[x]>arr[maxIndex])
    			maxIndex = x;
    	}
    	return arr[maxIndex];
    }

      ②.排序(选择排序,冒泡排序) Java中排序可用字典排序sort(byte[]) 进行排序

    //交换数据
    public static void swap(int[] arr,int a,int b)
    {
    	int temp = arr[a];
    	arr[a] = arr[b];
    	arr[b] = temp;
    }
    
    /*
    选择排序。0-1,0-2,0-3
    */
    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])
    			{
    				swap(arr,x,y);
    			}
    		}
    	}
    }
    /*
    选择排序。索引法
    */
    public static void selectSort_2(int[] arr)
    {
    	for(int x=0; x<arr.length-1; x++)
    	{
    		int num = arr[x];
    		int index = x;
    		for(int y=x+1; y<arr.length; y++)
    		{
    			if(num>arr[y])
    			{
    				num = arr[y];
    				index = y;
    			}
    		}
    		if(index!=x)
    			swap(arr,x,index);
    	}
    }
    /*
    冒泡排序。0-1,1-2,2-3
    */
    //方法①.
    public static void bubbleSort(int[] arr)
    {
    	for(int x=0; x<arr.length-1; x++)
    	{
    		for(int y=0; y<arr.length-1-x; y++)	//此处-1为了避免索引越界。-x为了让外循环增加一次,内循环参数与比较的元素个数递减。
    		{
    			if(arr[y]>arr[y+1])	
    			{
    				swap(arr,y,y+1);
    			}
    		}	
    	}
    }
    //方法②
    public static void bubbleSort_2(int[] arr)
    {
    	for(int x=arr.length-1;x>0;x--)
    	{
    		for(int y=0;y<x;y++)
    		{              
    			if(arr[y]>arr[y+1])	
    			{
    				swap(arr,y,y+1);
    			}         
    		}
    	}
    }
    ③.查找(基本查找、二分查找)
    /*
    数组常见功能:基本查找法。
    */
    public static int getIndex(int[] arr,int key)
    {
    	for(int x=0; x<arr.length; x++)
    	{
    		if(arr[x]==key)
    			return x;
    	}
    	return -1;
    }
    /*
    二分查找法(折半查找法)
    */
    public static int halfSearch(int[] arr,int key)		//查找的数组须有顺序的!
    {
    	int max,min,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(max<min)
    			return -1;
    		mid = (max+min)/2;
    	}
    	return mid;
    }
    public static int halfSearch_2(int[] arr,int key)    //方法二,采用最大值最小大小比较
    {
    	int max,min,mid;
    	min = 0;
    	max = arr.length-1;
    	while(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-1;
    }

    注意:折半查找需要是有序序列,如果原本数据不是有序的,不能采用排序再查找,这样会破坏原来表索引。方法类似java中提供的binarySearch(arr,num),其中arr为数组,num为要查找的数,如果查找不到即返回-插入点-1。

    ④.进制转换

    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;
    		arr[--pos] = chs[temp];
    		num  = num >>> offset;
    	}
    	for(int x=pos ;x<arr.length; x++)
    	{
    		System.out.print(arr[x]);
    	}
    	System.out.println();
    }
    
    //十进制-->十六进制。 Integer.toHexString
    public static void toHex(int num)
    {
    	trans(num,15,4);
    }
    //十进制-->二进制。 Integer.toBinaryString
    public static void toBinary(int num)
    {
    	trans(num,1,1);
    }
    //十进制-->八进制。 Integer.toOctalString
    public static void toOctal(int num)
    {
    	trans(num,7,3);
    }

    注:查表法:如果数据出现了对应关系,而且对应关系为一方是有序的数字编号,并作为索引使用,这时应想到采用数组的使用,将这些数据存储到数组中,根据运算结果作为索引之间去查数组中对应的元素即可。

    3.二维数组

    二维数组图解:

    二维数组图解

    二维数组的操作:

    //		int[] arr = new int[3];  
    //		System.out.println(arr);//[I@1fb8ee3  @左边是实体的类型。 @右边是实体的哈希值。
    
    //		int[][] arr = new int[3][2];//创建一个二维数组,该数组中有3个一维数组,每一个一维数组中有2个元素。
    //		System.out.println(arr);//直接打印二维数组。   [[I@c17164
    //		System.out.println(arr[0]);//直接打印二维数组中的角标0的一维数组。 [I@1fb8ee3
    //		System.out.println(arr[0][0]);//直接打印二维数组中的角标0的一维数组中角标为0的元素。 0
    
    
    
    //		int[][] arr = new int[3][];
    //		System.out.println(arr);//直接打印二维数组。   [[I@c17164
    //		System.out.println(arr[0]);//直接打印二维数组中的角标0的一维数组。null
    //		System.out.println(arr[0][0]);//直接打印二维数组中的角标0的一维数组中角标为0的元素。 NullPointerException
    
    
    	
    //		int[][] arr = new int[3][2];
    //		System.out.println(arr.length);//打印二维数组的长度。其实就是一维数组的个数。
    //		System.out.println(arr[1].length);//打印二维数组中角标为1一维数组的长度。
    
    		int sum = 0;
    		int[][] arr = {{3,1,7},{5,8,2,9},{4,1}};
    
    		for(int x=0; x<arr.length; x++)
    		{
    			for(int y=0; y<arr[x].length; y++)
    			{
    //				System.out.print(arr[x][y]+",");
    				sum += arr[x][y];
    				
    			}
    		}
    		System.out.println("sum="+sum);

    附一:

      内存的划分:

      1.寄存器。

      2.本地方法区。(跟系统有关系)

      3.方法区。

      4.栈内存。

        存储的都是局部变量,而且变量所属的作用域一旦结束,该变量就自动释放。

      5.堆内存。

        存储是数组和对象(其实数组就是对象) 凡是new建立在堆中。

        特点:

        1,每一个实体都有首地址值。

        2,堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同。整数是0,小数是0.0或者0.0f,boolean false,char 'u0000'。

        3,垃圾回收机制。

  • 相关阅读:
    ACdream 1114(莫比乌斯反演)
    ACdream 1148(莫比乌斯反演+分块)
    bzoj2301(莫比乌斯反演+分块)
    hdu1695(莫比乌斯反演)
    hdu4908(中位数)
    bzoj1497(最小割)
    hdu3605(最大流+状态压缩)
    【Leetcode】Add Two Numbers
    【Leetcode】Add Binary
    【Leetcode】Single Number II
  • 原文地址:https://www.cnblogs.com/Anand/p/4611296.html
Copyright © 2011-2022 走看看