You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动