如何用2D ArrayList替代2D Array?未知元素数量场景代码改造
把二维数组改造为二维ArrayList的解决方案
没问题!我来帮你把基于二维数组的分词代码改成用二维ArrayList的版本,完美适配元素数量不确定的场景。
核心思路
二维ArrayList本质是ArrayList<ArrayList<String>>,它支持动态扩容,不需要提前指定行数和列数,完全能应对后续元素数量未知的情况。相比固定大小的数组,它会自动调整容量,既不会出现数组越界,也不会浪费内存空间。
先看你可能的原数组代码(模拟示例)
假设你原来的代码大概是这样的(提前预估了行数和列数):
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ArrayTokenizer { public static void main(String[] args) { // 提前预估的行数和列数,无法适配未知数量的元素 int estimatedRows = 100; int estimatedCols = 5; String[][] tokenArray = new String[estimatedRows][estimatedCols]; try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) { String line; int rowIdx = 0; while ((line = br.readLine()) != null && rowIdx < estimatedRows) { String[] tokens = line.split(","); // 必须限制列索引,否则会数组越界 for (int colIdx = 0; colIdx < tokens.length && colIdx < estimatedCols; colIdx++) { tokenArray[rowIdx][colIdx] = tokens[colIdx]; } rowIdx++; } } catch (IOException e) { e.printStackTrace(); } } }
改造后的二维ArrayList版本
下面是改造完成的代码,完全去掉了固定大小的限制:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class ArrayListTokenizer { public static void main(String[] args) { // 初始化二维ArrayList,无需指定任何大小 ArrayList<ArrayList<String>> tokenList = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) { String line; // 逐行读取文件 while ((line = br.readLine()) != null) { // 按逗号分割当前行的内容 String[] tokens = line.split(","); // 创建临时列表存储当前行的分词结果 ArrayList<String> currentRow = new ArrayList<>(); for (String token : tokens) { // 可选:对分词做清洗,比如去除前后空格 currentRow.add(token.trim()); } // 将当前行的列表添加到二维ArrayList中 tokenList.add(currentRow); } } catch (IOException e) { e.printStackTrace(); } // 示例:遍历输出所有分词结果 for (ArrayList<String> row : tokenList) { System.out.println("行内容:" + row); } } }
关键优化点说明
- 动态扩容:不管后续有多少行,每行有多少个分词,ArrayList都会自动调整容量,再也不用提前预估大小。
- 避免越界:不用再担心
ArrayIndexOutOfBoundsException,因为添加元素时没有索引限制。 - 灵活处理:如果需要过滤空分词,可以在添加时加判断,比如:
if (!token.trim().isEmpty()) { currentRow.add(token.trim()); } - 便捷遍历:可以用增强for循环(如上示例),也可以用索引遍历:
for (int i = 0; i < tokenList.size(); i++) { ArrayList<String> row = tokenList.get(i); // 处理每行内容 }
内容的提问来源于stack exchange,提问作者random_user_0891




