Java学习笔记——多维数组

来源:互联网 发布:php 汉字长度 编辑:程序博客网 时间:2024/05/19 12:36

简介

一维数组可以存储线性的元素集合,而二维数组则能够存储矩阵和表格。

二维数组的基本知识

二维数组的元素通过行和列的下标来访问。

声明二维数组变量并创建二维数组

声明二维数组的语法如下:

数据类型[][] 数组名;或者数据类型 数组名[][];

例如:

int[][] matrix;或者int matirx[][];使用这个语法创建 5 x 5 的int型二维数组:matrix = new int[5][5];

二维数组中使用两个下标,一个表示行,一个表示列。与一维数组一样,每个下标索引值都是 int 型的,从 0 开始。

注意: 使用 matrix[2,1]访问行下标为2、列下标为1的元素是一种长江错误。在 Java 中,每个下标必须放在一对方括号中。

也可以使用数组初始化来声明、创建和初始化一个二维数组:

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

获取二维数组的长度

二维数组实际上是一个数组,它的每个元素都是一个一维数组。数组 x 的长度是数组中元素的个数,可以用 x.length 获取该值。

锯齿数组

二维数组红的每一行本身就是一个数组,因此,各行的长度可以不同。这样的数组称为锯齿数组。

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

处理二维数组

嵌套的for循环常用于处理二维数组。
假设如下创建数组 matrix:

int[][] matrix = new int[10][10];

使用输入值初始化二维数组

使用循环,实现用户输入值初始化数组:

Scanner input = new Scanner(System.in);System.out.println("Enter " + matrix.length + " rows and " + matrix[0].length + " coulmns: ");for(int row = 0; row < matrix.length; row++) {    for(int column = 0; column < matrix[row].length; column++) {        matrix[row][column] = input.nextInt();    }}

使用随机值初始化二维数组

使用 0 到 99 之间的随机整数初始化数组:

for(int row = 0; row < matrix.length; row++) {    for(int column = 0; column < matrix[row].length; column++) {        matrix[row][column] = (int)(Math.random() * 100);    }}

打印二维数组

为打印一个二维数组,可以使用这种循环打印数组中的每个元素:

for(int row = 0; row < matrix.length; row++) {    for(int column = 0; column < matrix[row].length; column++) {        System.out.println(matrix[row][column] + " ");    }    System.out.println();}

求所有元素的和

int total = 0;for(int row = 0; row < matrix.length; row++) {    for(int column = 0; column < matrix[row].length; column++) {        total += matrix[row][column];    }}

对数组按列求和

for(int column = 0; column < matrix[0].length; column++) {    int total = 0;    for(int row = 0; row < matrix.length; row++)        total += matrix[row][column];    System.out.println("Sum for column " + column + " is " + total);}

求二维数组最大的一行和

使用变量 maxRow 和 indexOfMaxRow 分别跟踪和的最大值以及该行的索引值。

int maxRow = 0;int indexOfMaxRow = 0;for(int column = 0; column < matrix[0].length; column++) {    maxRow += matrix[0][column];}for(int row = 1; row < matrix.length; row++) {    int totalOfThisRow = 0;    for(int column = 0; column < matrix[row].length; column++)        totalOfThisRow += matrix[row][column];        if(totalOfThisRow > maxRow) {            maxRow = totalOfThisRow;            indexOfMaxRow = row;        }    }    System.out.println("Row " + indexOfMaxRow + " has the maximum sum of " + maxRow);}

随机打乱

for(int i = 0; i < matrix.length; i++) {    for(int j = 0; j < matrix[i].length; j++) {        int i1 = (int)(Math.random() * matrix.length);        int j1 = (int)(Math.random() * matrix[i].length);        int temp = matrix[i][j];        matrix[i][j] = matrix[i1][j1];        matrix[i1][j1] = temp;    }}

实例练习:数独

public class CheckSudokuSolution {    public static void main(String[] args) {        //调用 readASolution() 读取数独表格        int[][] grid = readASolution();        System.out.println(isValid(grid) ? " Valid solution" : " Invalid solution ");    }    //从控制台读取用户输入的答案    public static int[][] readASolution() {        Scanner input = new Scanner(System.in);        System.out.println("Enter a Sudoku puzzle solution: ");        int[][] grid = new int[9][9];        for(int i = 0; i < 9; i++)             for(int j = 0; j < 9; j++)                grid[i][j] = input.nextInt();        return grid;    }    //检查答案是否有效    public static boolean isValid(int[][] grid) {        for(int i = 0; i < 9; i++)             for(int j = 0; j < 9; j++)                if(grid[i][j] < 1 || grid[i][j]  > 9 || !isValid(i, j, grid)                    return false;            return true;    }    public static boolean isValid(int i, int j, int[][] grid) {        //检查 grid[i][j] 在 i 行中是不是唯一的        for(int column = 0; column < 9; column++)            if(column != j && grid[i][column] == grid[i][j])                return false;        //检查 grid[i][j] 在 j 列中是否唯一        for(int row = 0; row < 9; row++)             if(row != i && grid[row][j] == grid[i][j])                return false;        //检查 grid[i][j] 在 3 x 3 格中是否唯一        for(int row = (i / 3) * 3; row < (i / 3) * 3 + 3; row++)            for(int col = (j / 3) * 3; col < (j / 3) * 3 + 3; col++)                 if(row != i && col != j && grid[row][col] == grid[i][j])                    return false;        return true;    }}

多维数组

二维数组由一个一维数组的数组组成,而一个三维数组可以认为是由一个二维数组的数组所组成。

可以对二维数组变量的声明以及二维数组的创建方法进行推广,用于声明 >= 3 的 n 维数组变量和创建 n 维数组。

下述语法声明一个三维数组变量 scores:

double[][][] scores = new double [6][5][2];

实例学习:每日温度和湿度

public class Weather {    public static void main(String[] args) {        final int NUMBER_OF_DAYS = 10;        final int NUMBER_OF_HOURS = 24;        double[][][] data = new double[Number_OF_DAYS][NUMBER_OF_HOURS][2];        Scanner input = new Scanner(Sytem.in);        for(int k = 0; k < NUMBER_OF_DAYS * NUMBER_OF_HOURS; k++) {            int day = input.nextint();            int hour = input.nextInt();            double temperature = input.nextDouble();            double humidity = input.nextDouble();            data[day - 1][hour - 1][0] = temperature;            data[day - 1][hour - 1][1] = humidity;        }        for(int i = 0; i < NUMBER_OF_DAYS; i++) {            double dailyTemperatureTotal = 0;            double dailyHumidityTotal = 0;            for(int j = 0; j < NUMBER_OF_HOURS; j++) {                dailyTemperatureTotal += data[i][j][0];                dailyHumidityTotal += data[i][j][1];            }            System.out.println("Day " + i + "'s average temperature is " + dailyTemperatureTotal / NUMBER_OF_HOURS);            System.out.println("Day " + i + "'s average humidity is " + dailyHumidityTotal / NUMBER_OF_hours);        }    }}
原创粉丝点击