Java_3 数组

本文介绍了Java中的数组,包括一维数组的创建、初始化和获取最小值,以及多维数组的声明、初始化和实例。此外,还讲解了如何进行数组的基本操作,如遍历、填充、排序、复制等,并给出了具体的示例代码。

1.数组概述

数组是具有相同数据类型的一组数据的集合。由基本数据类型组成的数组是对象。一维数组的每个基本单元都是基本数据类型的数据,二维数组就是每个单元是一维数组的一维数组,依此类推。

2.一维数组

一维数组的使之是一组相同类型数据的集合,当需要在程序中处理一组数据或者传递一组数据时,可以应用到这种类型的数组。

2.1 创建一维数组

数组作为对象允许使用new关键字进行内存分配。在使用数组之前,必须首先定义数组变量所属的类型,即声明数组。

两种声明方式:

数组元素类型  数组名字[];
数组元素类型[]  数组名字;

声明数组后,还不能访问他的任何元素,因为声明数组仅仅是给出数组名字和元素的数据类型,要真正使用数组还要为其分配内存空间,且分配内存空间时必须指明数组的长度。

数组名字 = new 数组元素类型[数组元素的个数];

二者合并执行

数组元素类型 数组名[] = new 数组元素类型[数组元素个数];

2.2 初始化一维数组

数组可以与基本类型一样进行初始化操作,数组的初始化可分别初始化数组中的每个元素。
初始化数组时可以省略new运算符和数组的长度,编译器将根据初始值的数量来自动计算数组的长度,并创建数组。

两种初始化方式

int arr2[] = {34,23,12,6}
int arr[] = new int[]{1,2,3,4,5}

2.3 获取一维数组的最小值

public class MinNum{
    public static void main(String[] args){
        int[] num = {2,4,7,1,6,34};
        System.out.println("输出一维数组:");
        for(int i = 0;i<num.length;i++){
            System.out.print(num[i]+"  ");
        }
        int min = num[0];
        for(int j = 0;j<num.length-1;j++){
            if(min > num[j+1]){
                min = num[j+1];
            }
        }
        System.out.println("\n 一维数组的最小值是:"+num);
    }
}

3.多维数组

3.1 二维数组
3.1.1 两种声明方式

数组元素类型 数组名字[][];
数组元素类型[][] 数组名字;
例:
a = new int[2][];
a[0] = new int[2];
a[1] = new int[3];

3.1.2 二维数组初始化
type arrayname[][] = {value1,value2````valuen};

例:int myarr[][] = {{12,0}{45,10}}
myarr[1][1] = 10;

例:在项目中创建Matrix类,在主方法中编写代码实现输出一个3行4列且所有元素都是0的矩阵。

public class Matrix {
    public static void main(String[] args){
        int a[][] = new int[3][4];
        System.out.println("输出3行4列的数组:");
        for(int i = 1;i<a.length;i++){
            for(int j = 0;j<a[i].length;j++){
                System.out.print(a[i][j]+"\t");
            }
            System.out.println();
        }
    }
}

3.2 三维数组

三维数组使用三个中括号,初始化三维数组时,由三层大括号进行初始化,使用时也更加麻烦,需要三层for循环。

在项目中创建Ransack类,在类的主方法中创建三维数组,并将三维数组在控制台输出。

public class Ransack{
    public static void main(String[] args){
        int arr[][][] = new int[][][]{  //创建三维数组
        {{1,2,3},{4,5,6}},
        {{7,8,9}{10,11,12}},
        {{13,14,15}{16,17,18}}
        };
        for(int = 0;i<arr.length;i++){
            System.out.println("三维数组的第"+(i+1)+"个元素是一个"+arr[0].length+"维数组,内容如下:");
            for(int j = 0;j<arr[0].length;j++){
                    System.out.print(arr[i][j][k]+"\t");
                }
                System.out.println();
            }
        }
    }
}

3.3 范例:对矩形进行转置运算

所谓矩形的转置运算就是将矩阵的行列互换,把a[i][j]的值存储在元素a[j][i]的位置,转换前是m×n维矩阵,转换后则是n×m维矩阵。
在项目中创建ArrayRowColemnSwap类,在类的主方法中声明二维矩阵,然后将此矩阵进行转置运算,并将结果输出到控制台。

public class ArrayRowColumnSwap{
    public static void main(String[] args){
        int arr[][] = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
        System.out.println("转置前的矩阵是:");
        printArray(arr);
        int arr2[][] = new int[arr.length][arr.length];
        for(int i = 0;i<arr.length;i++){
            for(int j=0;j<arr[i].length;j++){
                arr2[j][i] = arr[i][j];
            }
        }
        System.out.println("转置后的矩阵是:");
        printArray(arr2);
    }
    private static void printArray(int[][] arr){
        for(int i = 0;i<arr.length;i++){
            for(int j = 0;j<arr.length;j++){
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
    }
}

3.4 范例:求方阵的迹

方阵的迹,即方阵主对角线上所有元素的和,迹同时也是方阵的所有特征值之和。

例:

在项目中创建Trace类,在类的主方法中创建二维方阵,然后求出方阵的迹,并在控制台将结果输出。

public class Trace{
    public static void main(String[] args){
        int arr[][] = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
        int tr = 0;
        System.out.println("方阵arr[][]是:");
        for(int i = 0;i<arr.length;i++){
            for(int j = 0;j<arr.length;j++){
                System.out.print(arr[i][j]+"  ");
            }
            System.out.println();
        }
        for(int i=0;i<arr.length;i++){
            tr+=arr[i][i];
        }
        System.out.println("方阵 arr[][]的迹是:"+tr);
    }
}

4.数组的基本操作

java.util包的Arrays类包含用来操作数组(如排序和搜索)的各种方法。

4.1 遍历数组

在遍历数组时,通常使用for循环类实现。
在遍历数组时,使用foreach语句更简单,该语句并不是一个新的语法,而是for循环的简化格式。

例:
public class Tautog{
    public static void main(Strig[] args){
        int arr2[][] = {{3,4,3},{1,2}};
        System.out.println("二维数组中的元素是:");
        for(int x[]:arr2){
            for(int e:x){
                System.out.print(e+"  ");
            }
            System.out.println();
        }
    }
}

4.2 填充替换数组元素

数组中的元素定义完成后,可通过Arrays类的静态方法fill()来对数组中的元素进行替换。该方法通过各种重载形式可完成任意类的数组元素的替换。fill()有两种参数类型。

1.fill(int[] a,int value)方法

该方法可将指定的int值分配给int型数组的每个元素。
语法格式:
fill(int[] a ,intvalue)
a:要进行元素替换的数组
value:要存储数组中所有元素的值
返回值:填充后的数组

2.fill(int[] a,intformIndex,int toIndex,int value)

该方法将指定的int值分配给int型数组指定范围中的每个元素。填充的范围从索引fromIndex(包括)一直到toIndex(不包括)。

如果fromIndex = = toIndex,则填充范围为空。

语法格式:
fill(int() a,int fromIndex,int toIndex,int value)
a:要进行填充的数组。
fromIndex:要使用指定值填充的第一个元素的索引(包括)。
toIndex:要使用指定值填充的最后一个元素的索引(不包括)。
value:要存储数组所有元素的值。
返回值:替换元素后的数组。

如果指定位置大于或者等于要填充的数组长度,则会报出数组越界异常(ArrayIndexOutOf-BoundsException)

4.3 对数组进行排序

通过Arrays类的静态sort()方法实现对数组的排序,sort()方法提供了多种的重载形式,可对任意类型的数组进行升序排序。
语法格式:
Arrays.sort(object)
object:指进行排序的数组名称。
返回值:排序后的数组。

import java.util.Arrays;
public class Taxis{
    public static void main(String[] args){
        int arr[] = new int[]{23,22,14,35,45,8,18};
        System.out.println("原一维数组是:");
        for(int i = 0;i<arr.length;i++){
            System.out.print(arr[i]+"  ");
        }
        Arrays.sort(arr);
        System.out.println("\n升序排列后的数组是:");
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+"  ");
        }
    }
}

Java语言中的String类型数组的排序算法是根据字典编排顺序排序的,因此数字排在字母前面,大写字母排在小写字母前面。

4.4 复制数组

Arrays类的copy()方法与copyOfRange()方法可实现对数组的复制。copyOf()方法是复制数组至指定长度,copyOfRange()方法则将指定数组的指定长度复制到一个新数组中。

1.copyOf()方法

该方法提供了很多种重载形式,来满足不同类型数组的复制。
copyOf(arr,int newlength)
arr:要进行复制的数组。
newlength:int型常量,指复制后的新数组的长度。如果新数组的长度大于数组arr的长度,则用0填充(根据复制数组的类型类决定填充的值,整型数组用0填充,char型数组则会使用null来填充);如果复制后的数组长度小于数组arr的长度,则会从数组arr的第一个元素开始截取至满足新数组长度为止。
返回值:复制后的数组。

2.copyOfRange()方法

语法格式如下:
copyOfRange(arr,int formIndex,int toIndex)
arr:要进行复制的数组对象。
formIndex:指定开始复制数组的索引位置。formIndex必须是在0至整个数组的长度之间。新数组包括索引是formIndex的元素。
toIndex:要复制范围的最后索引位置。可以大于数组arr的长度。新数组不包括索引是toIndex的元素。
返回值:复制指定位置后的数组。

4.5 对比一维、二维数组所占内存

在项目中创建OneArrayMemory类,在类的主方法中使用一维、二维数组存储相同的数据,在控制台输出他们所占的内存。

public class OneArraysMemory{
    public static void main(String[] args){
        int num1 = 1024*1024*2;
        int[] arr1 = new int[num1];
        for(int i = 0;i<arr1.length;i++){
            arr1[i] = i;
        }
        //获取占用内存总数,并将单位转化为MB
        long menmory1 = Runtime.getRuntime().totalMemory()/1024/1024;
        System.out.println("用一维数组存储占用内存总量为:"+memory1);
        int num2 = 1024*1024;
        int[][] arr2 = new int[num2][2];
        for(int i = 0;i<arr2.length;i++){
        arr2[i][0]=i;
        arr2[i][1]=i;
        }
        //获得占用内存总数,并将单位转换为MB
        long memory2 = Runtime.getRuntime().totalMemory()/1024/1024;
        System.out.println("用二维数组存储占用内存总量为:"+memory2);
    }
}

4.6 直接插入排序

public class Sclect {
    //定义数组遍历操作
    public static void lastArr(int[] arr){
        for (int i : arr) {
            System.out.print(i+"  ");
        }
    }
    //调换操作
    public static void change(int[] arr,int firstIndex,int lastIndex){
        int tmp = arr[firstIndex];
        arr[firstIndex]=arr[lastIndex];
        arr[lastIndex]=tmp;
    }
    //选择排序
    public static void sclect(int arr[]){
    //外层循环控制比较的轮数n-1;
        for(int i=0;i<arr.length-1;i++){
            int p=i;
            for(int j=i+1;j<arr.length;j++){
                //判断当前p的元素是否大于j对应的元素
                if(arr[p]<arr[j]){
                    p=j;
                }
            }
            if(i!=p)
                change(arr, i, p);
        }
    }
    public static void main(String[] args) {
        // 初始化一个数组
        int arr[]=new int[5];
        Scanner in = new Scanner(System.in);
        System.out.println("请输入5名学生的成绩:");
        for(int i=0;i<arr.length;i++){
            arr[i] = in.nextInt();
        }
        sclect(arr);
        System.out.print("学生成绩按降序排列为:");
        lastArr(arr);
    }
}

4.7 冒泡排序

import java.util.Scanner;
public class Bubbling {
        //冒泡排序
    public static void bubbling(int[] arr){
        for(int i=1;i<arr.length;i++){
            for(int j=0;j<arr.length-i;j++){
            if(arr[j]>arr[j+1]){
                change(arr, j, j+1);
                }
            }
        }
    }
        //数组调换
    public static void change(int[] arr,int firstIndex,int lastIndex){
        int tmp = arr[firstIndex];
        arr[firstIndex]=arr[lastIndex];
        arr[lastIndex]=tmp;
    }
        //输出操作
    public static void lastArr(int[] arr){
        for(int i=0;i<arr.length;i++)
            System.out.print(arr[i]+"  ");
    }
    public static void main(String[] args){
        //输入五个数据
        Scanner in = new Scanner(System.in);
        int arr[]=new int[5];
        System.out.print("请输入需要排序的5个数据:");
        for(int i=0;i<arr.length;i++){
            arr[i] = in.nextInt();
        }
        System.out.println("排序前的数组顺序:");
        lastArr(arr);
        bubbling(arr);
        System.out.println("\n排序后的数组顺序:");
        lastArr(arr);
    }
}

4.8 二分法查找

public class Binary {

    public static void search(int[] arr,int tmp){
        //数组的下标最高位和最低位
        int hight=arr.length-1;
        int low=0;
        while(low<=hight){
            int p=(hight+low)/2;
            if(arr[p]==tmp){
                System.out.println("\n"+p);
                break;
            }
            else if(arr[p]>tmp)
                hight = p-1;
            else
                low = p+1;
        }
    }
    public static void main(String[] args) {

        int arr[]={1,5,5,3,8,4,10,33,45};
        Arrays.sort(arr);
        for (int i : arr) {
            System.out.print(i+"  ");
        }
        search(arr,5);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值