Day04 Java数组声明创建+使用+冒泡排序+稀疏数组(附上代码)

一.一维数组

数组的基本特点:

1.长度是确定的,数组被创建后是不可改变大小的

2.数组元素必须是相同类型

3.元素可以是任何数据类型,包括基本数据类型和引用类型

4.数组属于引用类型,数组也可看成对象,数组中每个元素相当于该对象的成员变量,因此数组一经分配空间,其中每个元素也被按照和实例变量同样的方式被隐式初始化,同时数组本身就是对象(new一个对象),而Java的对象本身就在堆当中,因此初始化的数组在堆中。

声明和初始化:

//数组nums声明

int[] nums;

//数组初始化,new说明开辟了10个空间

nums=new int[10];

//数组赋值,不赋值会自动赋默认值,如int类型默认值是0

nums[0]=10;

//注意这种写法是错误的:

int[] nums;//定义数组为int 类型

nums={1,2,3};//报错了!!!!!!!!

总结声明和初始化:

1.静态初始化:创建+赋值

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

2.引用类型,新建一个Man.java文件,里面有一个叫Man的类

Man[] men={new Man(),new Man(),new Man()...};

3.动态初始化:包含默认初始化

int[] b=new int[10];

b[0]=10;

数组的使用:

一维数组的使用:1.直接打印;2.数组作为形式参数传递给方法;3.反转打印

public class arraydemo01 {
    public static void main(String[] args) {
        int[] a={1,2,3,4,5};
        //数组的使用-直接打印
        for (int i : a) {
            System.out.println(i);//直接打印
        }
        //数组的使用-数组可作为方法参数
        printArray(a);
        //数组的使用-反转数组
        reverse(a);
    }
    public  static  void printArray(int[] a){
       for(int i=0;i<a.length;i++){
           System.out.print(a[i]);
        }
        }
    public  static  void reverse(int[] a){
        for(int i=a.length-1;i>=0;i--){
            System.out.println(a[i]);
        }
    }
    }

扩展:

声明和初始化时数组在计算机的内存分配情况

二.多维数组(只了解二维)

直接声明+初始化:

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

输出方式:

1.直接打印; 2.通过将数组传参给方法

代码实践:

package base;

public class arrarydemo02 {
    public static void main(String[] args) {
        //1.二维-直接声明+初始化
        int[][] nums={
   
   {1,2},{3,4},{5,6}};
        //2.随便输出一些测试
        System.out.println(nums[0][0]);
        System.out.println(nums[0]); //输出哈希码,是地址
        System.out.println(nums.length);//输出3
        System.out.println(nums[0].length);//输出2
        //3.直接输出每个元素
        for(int i=0;i<nums.length;i++){
            for(int j=0;j<nums[i].length;j++){
                System.out.println(nums[i][j]);
            }
        }
        //4.通过调用方法输出部分
        System.out.println("=================");
        printArray(nums[0]);
    }
    public  static  void printArray(int[] a){
        for(int i=0;i<a.length;i++){
            System.out.println(a[i]+" ");
        }
    }
}

三.Java里的Arrays类(Java提供很多方便的方法,可在Java的API文档里找)

使用arrays的方法需要导入工具类:

import java.util.arrays

这里学习几个方法就好:

1.Arrays.toString():作用是将括号内容通过字符串形式打印

2.Arrays.sort():对数组元素进行升序排序

3.Arrays.fill():将括号内涉及的元素变为0

注意输出要用Arrays.toString()方法

代码实践:

输出结果:

 

四.冒泡排序

冒泡不论是理解还是怎么样都要记住,冒泡使用频率很高,多写几次代码差不多就掌握了,之前写的例子可以帮助理解:

键盘输入这n个数字分别是 2 3 1 1

for (int i = 0; i < n - 1; i++) {# i的所有遍历值为 0 1 2
        for (int j = 0; j < n - 1 - i; j++) {#当i=0时,j的所有遍历值为 0 1 2;当i=0时,j的所有遍历值为                                                         0 1 ;当i=0时,j的所有遍历值为 0 ;

i=0且j=0时,a[j]=a[0]=2 a[j+1]=a[1]=3  不满足if条件,a[j]与a[j+1]不交换位置  数组a[100]: 2 3 1 1

i=0且j=1时,a[j]=a[1]=3 a[j+1]=a[2]=1  满足if条件,a[j]与a[j+1]交换位置  数组a[100]: 2 1 3 1

i=0且j=2时,a[j]=a[2]=3 a[j+1]=a[3]=1  满足if条件,a[j]与a[j+1]交换位置  数组a[100]: 2 1 1 3

i=1且j=0时,a[j]=a[0]=2 a[j+1]=a[1]=1  满足if条件,a[j]与a[j+1]交换位置  数组a[100]: 1 2 1 3

i=1且j=1时,a[j]=a[1]=3 a[j+1]=a[2]=1  满足if条件,a[j]与a[j+1]交换位置  数组a[100]: 1 1 2 3

i=2且j=0时,a[j]=a[0]=3 a[j+1]=a[1]=1  满足if条件,a[j]与a[j+1]不交换位置  数组a[100]: 1 1 2 3

练习代码

五.稀疏数组

用来记录有效坐标

当一个数组中大部分元素为0或者为同一值时,可使用稀疏数组来压缩空间。

处理方式:

记录数组一共有几行几列,有多少个不同值

把具有不同值的元素和行列存放在一个小规模的数组中,起到压缩作用

原始数组:

0     0     0     0     0 

0     1     0     0     0 

0     0     2     0     0 

0     0     0     0     0 

0     0     0     0     0 

这个5*5的数组只有1,2两个有效值,其余都是0,

保存在稀疏数组中:

[0] 5 5 2
[1] 1 1 1
[2] 2 2 2

第[0]行表示数组有5行5列,有效值个数是2

第[1]行表示在数组的第1行第1列有数值1

第[2]行表示在数组的第2行第2列有数值2

练习(反复练习)

思路:将原始数组压缩成稀疏数组,再将稀疏数组还原成原始数组

代码:

package array;
public class arraydemo05 {
    public static void main(String[] args) {
        //创建5*5数组
        int[][] array1=new int[5][5];
        array1[1][1]=1;
        array1[2][2]=2;
        //输出原始数组
        System.out.println("输出原始数组:");
        for (int[] ints:array1){
            for(int anInt:ints){
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
        //转换成稀疏数组保存:
        //先获得原始数组有效值个数
        int sum=0;//记录有效值个数
        for(int i=0;i<5;i++){
            for (int j=0;j<5;j++){
                if(array1[i][j]!=0){
                    sum++;
                }
            }
        }
        //创建稀疏数组
        int[][] array2=new int[sum+1][3];
        array2[0][0]=5;
        array2[0][1]=5;
        array2[0][2]=sum;
        //遍历array1,把原始数组非0值放在稀疏数组
        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]+"\t"+array2[i][1]+"\t"+array2[i][2]);
        }
        //还原,根据稀疏数组输出原始数组
        int[][] array3=new int[array2[0][0]][array2[0][1]];//数组大小
        for(int i=1;i<array2.length;i++){
            array3[array2[i][0]][array2[i][1]]=array2[i][2];
        }
        //输出还原数组
        System.out.println("输出还原数组:");
        for(int[] ints:array3){//先一维一维输出
            for(int anInt:ints){//再一个一个输出
                System.out.print(anInt+" ");
            }
            System.out.println();
        }

    }
}

运行结果: 

猜你喜欢

转载自blog.csdn.net/m0_67042480/article/details/128926715