Java中使用ArrayList创建二维数组

计蒜客data structure:Code_01

package www.jisuanke.ds;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * @author wangchong
 * @date 2019/4/30 16:09
 * @email 876459397@qq.com
 * @CSDN https://blog.csdn.net/wfcn_zyq
 * @describe
 */
public class Code_01_SpecialMatrix {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int m = input.nextInt();
        ArrayList[] arrayList = new ArrayList[n];
        for (int i = 0; i < n; i++) {
            arrayList[i] = new ArrayList<Integer>();
        }
        for (int i = 0; i < m; i++) {
            int x = input.nextInt();
            int y = input.nextInt();
            arrayList[x - 1].add(y);
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < arrayList[i].size(); j++) {
                if (j < arrayList[i].size() - 1) {
                    System.out.print(arrayList[i].get(j) + " ");
                } else {
                    System.out.print(arrayList[i].get(j));
                }
            }
            System.out.println();
        }
    }
}

<think>嗯,用户想了解如何在Java使用List创建二维数组,并且需要示例。之前已经回答过关于List元素引用的问题,现在用户的问题转向了二维数组的实现。我需要结合之前的引用内容,特别是引用2、3、5,这些提到了如何将List转换为二维数组,以及如何创建包含List的List结构。首先,用户的问题是用List实现二维数组,也就是用List来模拟二维数组的结构。Java中的List可以嵌套,比如List<List<String>>,这样每个外层List的元素又是一个List,相当于二维数组的行和列。需要给出具体的创建示例,可能包括初始化、添加元素、遍历等步骤。 然后,我需要参考用户提供的引用。引用2中有一个ArrayList<int[]>转换成二维数组的例子,使用toArray方法。引用3则详细说明了如何将List<List<String>>转为String[][],提到了两种方法:使用toArray和手动遍历。引用5的代码示例展示了如何构建一个List<List<String>>的结构,通过逐步添加元素到内部List,再添加到外层List。 用户可能需要的不仅仅是转换,而是如何用List来模拟二维数组,包括初始化、添加元素、访问元素等操作。需要分步骤讲解,可能包括动态调整大小的优势,比如不需要预先指定行数和列数,可以灵活添加行和列。 还要注意用户提到的系统级指令,比如数学表达式用$...$,但这个问题可能涉及较少数学内容,但需要正确使用代码块,用Java语法。同时要生成相关问题,可能涉及性能、遍历方法、与数组的对比等。需要确保回答结构清晰,分步骤说明,每个步骤有代码示例,并引用相关的引用内容。例如,在动态添加行和列时,引用5中的例子展示了如何逐行添加元素。在转换部分,引用2和3提供了转换方法。最后,检查是否覆盖了所有关键点:创建List的二维结构、添加元素、访问元素、遍历、转换为二维数组,以及注意事项如空值处理、动态扩展优势。然后生成相关问题,比如如何优化性能,如何处理不同长度的行,或者如何与传统的二维数组对比。</think>### Java使用List实现二维数组的完整指南 #### 一、基础实现原理 Java通过`List`嵌套结构可实现动态二维数组,其核心是使用`List<List<T>>`作为容器,其中外层`List`表示行,内层`List`表示列元素[^4]。与传统数组相比,这种实现具有以下优势: - 动态扩展行/列长度 - 支持不同类型元素 - 自带丰富的操作方法 #### 二、具体实现步骤 1. **初始化二维List** ```java List<List<String>> matrix = new ArrayList<>(); // 创建空二维结构 ``` 2. **添加行与列** ```java // 添加新行 matrix.add(new ArrayList<>()); // 添加第一行 matrix.add(new ArrayList<>()); // 添加第二行 // 填充数据 matrix.get(0).add("A1"); // 第一行第一列 matrix.get(0).add("A2"); // 第一行第二列 matrix.get(1).add("B1"); // 第二行第一列 ``` 3. **动态扩展示例** ```java // 动态添加第三行 matrix.add(new ArrayList<>(Arrays.asList("C1", "C2", "C3"))); // 使用集合初始化 // 在第二行追加元素 matrix.get(1).add("B2"); // 第二行现在包含["B1", "B2"] ``` #### 三、元素访问方法 | 操作类型 | 代码示例 | 时间复杂度 | |----------------|-----------------------------------|------------| | 读取元素 | `matrix.get(row).get(col)` | $O(1)$ | | 修改元素 | `matrix.get(0).set(1, "NewVal")` | $O(1)$ | | 遍历所有元素 | 嵌套循环 | $O(n*m)$ | ```java // 遍历示例 for (int i=0; i<matrix.size(); i++) { // 遍历行 for (int j=0; j<matrix.get(i).size(); j++) { // 遍历列 System.out.print(matrix.get(i).get(j) + " "); } System.out.println(); } ``` #### 四、转换为二维数组 1. **统一列长转换** ```java String[][] array = new String[matrix.size()][]; for (int i=0; i<matrix.size(); i++) { array[i] = matrix.get(i).toArray(new String[0]); // 自动适配列长[^3] } ``` 2. **非统一列长处理** ```java // 手动处理不同列长 int[][] irregularArray = new int[matrix.size()][]; for (int i=0; i<matrix.size(); i++) { List<Integer> row = matrix.get(i); irregularArray[i] = new int[row.size()]; for (int j=0; j<row.size(); j++) { irregularArray[i][j] = row.get(j); } } ``` #### 五、特殊场景处理 1. **空值检测** ```java if(matrix != null && !matrix.isEmpty()) { List<String> firstRow = matrix.get(0); if(firstRow != null && !firstRow.isEmpty()) { String value = firstRow.get(0); } } ``` 2. **动态列操作** ```java // 插入列 matrix.forEach(row -> row.add(2, "Inserted")); // 在所有行第三列插入元素 // 删除列 matrix.forEach(row -> { if(row.size() > 2) row.remove(2); }); ``` #### 六、性能优化建议 - 初始化时指定容量:`new ArrayList<>(initialCapacity)` - 使用`LinkedList`实现行结构时,插入删除操作时间复杂度为$O(1)$ - 批量操作使用`addAll()`代替多次`add()` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值