基础部分(六)数组

 

数组

定义

1.数组是相同类型数据的有序集合

2.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成

3.其中的每个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们

例1:

public class Demo01 {

    public static void main(String[] args) {

        //变量类型 变量名字 = 变量值;

        int[] nums;//1.声明一个数组

        //int nums[]; 效果相同,但非首选方法

        //Java语言使用new操作符来创建数组

        nums = new int[5];//2.创建一个数组

        //3.给数组元素中赋值

        nums[0]=1;

        nums[1]=2;

        nums[2]=3;

        nums[3]=4;

        nums[4]=5;

        //计算所有元素和

        int sum=0;

        //获取数组长度 arrays.length

        for (int i = 0; i < nums.length; i++) {

            sum+=nums[i];

        }

        System.out.println(sum);

    }

}

·数组的元素是通过索引访问的,数组索引从0开始

三种初始化

1·静态初始化

  int[] a = {1,2,3};

  Man[] mans = {new Man(1,1),new Man(2,2)};

 

2·动态初始化

  int[] a = new int[2];

  a[0]=1;

  a[1]=2;

 

3·数组的默认初始化

  数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被吟诗初始化。(一般为0或者null)

数组的四个基本特点

·其长度是确定的。数组一旦创建,它的大小就是不可改变的

·其元素必须是相同类型,不允许出现混合类型

·数组中的元素可以是任何数据类型,包括基本类型和引用类型

·数组可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型数组对象本身是在堆中的。

数组边界

·下标的合法区间:[0,length-1],若越界就会报错

例如

public static void main(String[] args) {

      int[] a = new int[2];

        System.out.println(a[2]);

}

 

运行结果:

 

·ArrayIndexOutOfBoundsException:数组下标越界异常!

数组使用

·普通for循环

·for-each循环

·数组作方法入参

·数组作返回值

例2:

public class Demo04 {
    public static void main(String[] args) {
        int[] arrays={1,2,3,4,5};
        //foreach JDK1.5 没有下标
        for (int array : arrays) {
           System.out.println(array);
         }
        print(arrays);
        int[] reverse = reverse(arrays);
        print(reverse);
    }
    //反转数组 作为方法的调用
    public static int[] reverse(int[] arrays){
      int[] result=new int[arrays.length];
      //反转操作
        for (int i=0,j=result.length-1;i < arrays.length ; i++,j--) {
            result[j]=arrays[i];
        }
      return result;
    }
    //打印数组元素
    public static void print(int[] arrays){
        for (int i = 0; i <arrays.length ; i++) {
            System.out.print(arrays[i]+" ");
        }
    }

}

多维数组

·多维数组可以堪称数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。

·二维数组 int a[][] = new int [2][5];

  该二维数组a可看成一个两行五列的数组

例3:

public class Demo05 {

    public static void main(String[] args) {

        int[][] array = {{1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}};

        for (int i = 0; i <array.length ; i++) {

            for (int j = 0; j <array[i].length ; j++) {

                System.out.print(array[i][j]+" ");

            }

            System.out.println();

        }

    }

}

输出结果:

 

Arrays

·数组的工具类java.util.Arrays

·查看JDK帮助文档

·Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而“不用”对象进行调用.(注意是“不用”,而不是“不能用”)

·具有以下常用功能:

1.给数组赋值:通过fill方法

2.给数组排序:通过sort方法

3.比较数组:equals方法比较数组中元素是否相等。

4.查找数组元素:通过binarySearch方法对排序好的数组进行二分查找法操作

例4:

public class Demo06 {

    public static void main(String[] args) {

        int[] a ={112,2,34,9786,43515,432,36,6};

        Arrays.sort(a); //数组进行排序

        System.out.println(Arrays.toString(a));

        Arrays.fill(a,2,4,0); //数组填充

        System.out.println(Arrays.toString(a));

    }

}

输出结果:

 

 

例5:冒泡排序 时间复杂度为O(n2)

import java.util.Arrays;

/*冒泡排序

      1.比较数组中两个相邻的元素,若第一个数比第二个数大,交换两数的位置

      2.每次比较都会产生一个最大或最小的数字

      3.下一轮可以少一次排序

      4.依次循环直到结束

 */

public class Demo07 {

    public static void main(String[] args) {

        int[] a={2,4,124,5,351,41,51,4125};

        int[] sort= sort(a);

        System.out.println(Arrays.toString(a));

    }

    public static int[] sort(int[] array){

        int tmp=0;

        //外层循环:判断要走多少次

        for (int i = 0; i <array.length-1 ; i++) {

            boolean flag = false; //优化 通过flag减少无意义的比较

            //内层循环 比较两数 上述第一步

            for (int j = 0; j <array.length-1 ; j++) {

                if(array[j+1]<array[j]){

                    tmp=array[j];

                    array[j]=array[j+1];

                    array[j+1]=tmp;

                    flag=true;

                }

            }

            if(flag=false) {

                break;

            }

        }

        return array;

    }

}

输出结果:

 

稀疏数组

·当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组

·稀疏数组的处理方式是:

1.记录数组共有几行几列,有几个不同的值

2.把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模

·如下图,左边是原始数组,右边是稀疏数组

例6:利用稀疏数组存储一个五子棋棋盘  

public class Demo08 {

    public static void main(String[] args) {

        //1.创建一个二维数组11*11  0:空白  1:黑棋 2; 白棋

        int[][] array1=new int[11][11];

        array1[1][2]=1;

        array1[2][3]=2;

        //输出原始数组

        System.out.println("输出原始数组");

        for (int i = 0; i < array1.length; i++) {

            int[] ints = array1[i];

            for (int anInt : ints) System.out.print(anInt + " ");

            System.out.println();

        }

        System.out.println("====================");

        //转换为稀疏数组来保存

        //获取有效值的个数

        int sum = 0;

        for (int i = 0; i <11 ; i++) {

            for (int j = 0; j <11 ; j++) {

                if (array1[i][j]!=0){

                    sum++;

                }

            }

        }

        System.out.println("有效值的个数="+sum);

        //2.创建一个稀疏数组

        int[][] array2= new int[sum+1][3];

        array2[0][0]=11;

        array2[0][1]=11;

        array2[0][2]=sum;

        //遍历二维数组,将非零值,存放在稀疏数组中

        int count=0;

        for (int i = 0; i <array1.length ; i++) {

            for (int j = 0; j < array1[i].length; j++) {

                if (array1[i][j]!=0){

                    count++;

                    array2[count][0]=i;

                    array2[count][1]=j;

                    array2[count][2]=array1[i][j];

                }

            }

        }

        //输出稀疏数组

        System.out.println("稀疏数组");

        for (int i = 0; i < array2.length; i++) {

            System.out.println(array2[i][0]+" "

                    +array2[i][1]+" "

                    +array2[i][2]+" ");

        }

        System.out.println("====================");

        //将稀疏数组还原

        System.out.println("还原");

        //1.读取稀疏数组

        int[][] array3 = new int[array2[0][0]][array2[0][1]];

        //2.给其中元素还原它的值

        for (int i = 1 ; i <array2.length; i++) {

            array3[array2[i][0]][array2[i][1]]=array2[i][2];

        }

        //3.打印

        System.out.println("输出还原的数组");

        for (int[] ints : array1) {

            for (int anInt : ints) {

                System.out.print(anInt+" ");

            }

            System.out.println();

        }

    }

}

输出结果:

 

原文地址:https://www.cnblogs.com/alljust4u/p/13256479.html