Java从入门到放弃(十八):数组操作(下)

二维数组

二维数组可以被看作是数组的数组,它是一种多维数据结构,非常适合于存储表格形式的数据。在Java中,二维数组的声明和初始化如下所示:

public class Main {
    public static void main(String[] args) {
        int[][] ns = {
            { 1, 2, 3, 4 },
            { 5, 6, 7, 8 },
            { 9, 10, 11, 12 }
        };
        // ns.length表示二维数组的行数
        System.out.println(ns.length); // 输出 3
    }
}

在这个例子中,ns是一个二维数组,它包含3个一维数组(即3行),每个一维数组包含4个整数(即4列)。当我们访问ns.length时,它返回的是二维数组的外层数组的长度,也就是行数。实际上ns在内存中的结构如下:

如果我们想要获取二维数组中某一行的数组,我们可以这样做:

public class Main {
    public static void main(String[] args) {
        int[][] ns = {
            { 1, 2, 3, 4 },
            { 5, 6, 7, 8 },
            { 9, 10, 11, 12 }
        };
        // arr0现在指向ns的第0行
        int[] arr0 = ns[0];
        // arr0.length表示第0行的长度,也就是列数
        System.out.println(arr0.length); // 输出 4
    }
}

在这个例子中,arr0变量被赋值为ns的第0行,也就是一维数组{ 1, 2, 3, 4 }arr0.length表示的是这个一维数组的长度,即它包含的元素数量。

在内存中,ns这个二维数组的结构可以被看作是一个数组的数组。每个元素(即每一行)都是一个独立的一维数组。当我们通过ns[0]访问第一行时,我们实际上是访问了这个数组中的一个元素,它本身是一个数组。

访问二维数组中的特定元素需要通过指定行索引和列索引来完成,格式为array[row][col]。例如,要访问上面示例中二维数组ns的第2行第3列的元素(值为7),可以这样做:

System.out.println(ns[1][2]); // 输出 7

二维数组中的每一行实际上是一个一维数组,这些一维数组不需要具有相同的长度。这意味着你可以定义一个二维数组,其中每一行的元素数量可以不同,如下所示:

int[][] ns = {
    { 1, 2, 3, 4 },
    { 5, 6 },
    { 7, 8, 9 }
};

为了打印出整个二维数组的内容,你可以使用两层嵌套的for循环来遍历每一行和每一行中的每个元素:

for (int[] arr : ns) {
    for (int n : arr) {
        System.out.print(n);
        System.out.print(", ");
    }
    System.out.println();
}

这种方法会按行打印数组,每行的元素之间用逗号和空格分隔。

另外,可以使用Java标准库中的Arrays.deepToString()方法来打印二维数组,它会返回一个格式化的字符串,表示整个数组的结构:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[][] ns = {
            { 1, 2, 3, 4 },
            { 5, 6, 7, 8 },
            { 9, 10, 11, 12 }
        };
        // 打印出二维数组的字符串表示
        System.out.println(Arrays.deepToString(ns));
    }
}

Arrays.deepToString()方法会递归地应用Arrays.toString()到二维数组的每个子数组上,从而生成一个包含了所有层级元素的字符串表示。

三维数组

三维数组可以被视为二维数组的数组,它是多维数组的一个扩展。在Java中,你可以这样定义一个三维数组:

int[][][] ns = {
    {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    },
    {
        {10, 11},
        {12, 13}
    },
    {
        {14, 15, 16},
        {17, 18}
    }
};

在这个定义中,ns是一个三维数组,其中包含3个二维数组,每个二维数组又包含多个一维数组。在内存中,这个三维数组的结构可以被视为一个嵌套的数组,其中每个元素都是一个数组,而这些数组又包含更多的数组。

要访问三维数组中的特定元素,你需要指定三个索引,例如,ns[2][0][1]将会访问到值15。这个索引的顺序对应于三维空间中的x、y、z坐标,帮助你在数组的三个维度上定位到具体的元素。

尽管理论上可以定义任意维度的数组,但在实际编程实践中,我们很少使用超过三维的数组。二维数组由于其在表示表格数据和矩阵操作中的直观性而被广泛使用,而三维数组则在处理更复杂的数据结构,如体素(在三维空间中的像素)或者多维数据集时发挥作用。更高维度的数组虽然在某些特定的数学或科学计算中可能有用,但在大多数应用程序中并不常见,因为它们的使用和理解都相对复杂。

命令行参数

Java程序的启动点是main方法,这个方法可以接收命令行参数,这些参数以字符串数组(String[])的形式传递给main方法。这些参数是由Java虚拟机(JVM)从用户输入中获取,并在程序运行时传递给main方法的。

以下是一个简单的示例,展示了如何使用命令行参数:

public class Main {
    public static void main(String[] args) {
        // 遍历所有的命令行参数
        for (String arg : args) {
            System.out.println(arg); // 打印每个参数
        }
    }
}

在这个示例中,如果我们要实现一个特定功能,比如打印程序的版本号,我们可以检查传入的参数中是否包含-version。如果包含,我们就打印出版本号,并退出程序:

public class Main {
    public static void main(String[] args) {
        // 遍历所有的命令行参数
        for (String arg : args) {
            if ("-version".equals(arg)) {
                System.out.println("v 1.0"); // 打印版本号
                break; // 退出循环
            }
        }
    }
}

要运行这个程序并传递参数,首先需要编译它:

$ javac Main.java

编译成功后,可以通过以下命令运行程序并传递-version参数:

$ java Main -version

如果程序检测到-version参数,它将打印出版本号v 1.0

这种方法允许程序根据不同的输入参数执行不同的操作,提供了灵活的命令行接口。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧