Java中能否创建存储ArrayList的数组,且ArrayList存3元素字符串数组?
解决方案
你想要的嵌套结构完全可以实现,原代码的问题主要出在数组初始化错误和未初始化ArrayList实例,以下是修正后的实现:
核心问题分析
- 你需要的是长度为10的一维数组,每个元素是
ArrayList<String[]>,但原代码写成了二维数组new ArrayList<String[]>[10][3],不符合需求 - 数组中的每个
ArrayList对象没有被初始化,直接赋值会抛出NullPointerException - 循环中
stationsString = metrolines[0][2]固定取第一行数据,应该根据循环变量j取对应线路的数据
修正后的代码
// 初始化长度为10的数组,每个元素是ArrayList<String[]> // Java不允许直接创建泛型数组,需强制类型转换 ArrayList<String[]>[] metroMap = (ArrayList<String[]>[]) new ArrayList[10]; // 给数组中的每个位置初始化ArrayList实例 for (int j = 0; j < 10; j++) { metroMap[j] = new ArrayList<>(); String stationsString = metrolines[j][2]; // 取当前线路的字符串数据 // 注意:如果occurences返回的是逗号数量,车站总数是逗号数+1,根据实际逻辑调整 int stationCount = occurences(metrolines[j][2], ',') + 1; for (int i = 0; i < stationCount; i++) { // 创建长度为3的字符串数组存储单条车站数据 String[] station = new String[3]; // 处理车站名称和可见性标记 if (stationsString.charAt(0) == '*') { station[0] = stationsString.substring(1, stationsString.indexOf(' ')); station[2] = "Visible"; } else { station[0] = stationsString.substring(0, stationsString.indexOf(' ')); station[2] = "Invisible"; } stationsString = stationsString.substring(stationsString.indexOf(' ') + 1); // 处理坐标信息 if (stationsString.indexOf(' ') != -1) { station[1] = stationsString.substring(0, stationsString.indexOf(' ')); stationsString = stationsString.substring(stationsString.indexOf(' ') + 1); } else { station[1] = stationsString; } // 将车站数据添加到当前线路的ArrayList中 metroMap[j].add(station); } }
关键说明
- 数组初始化:由于Java泛型的限制,不能直接创建
ArrayList<String[]>类型的数组,需先创建非泛型的ArrayList数组,再强制转换为泛型类型 - ArrayList实例化:必须给数组的每个位置单独创建
ArrayList<String[]>对象,否则会出现空指针异常 - 数据匹配:循环中使用
metrolines[j][2]获取对应线路的数据,保证每条线路的处理逻辑对应正确的数据源 - 数量计算:如果
occurences方法统计的是字符串中逗号的个数,那么实际车站数量是逗号数+1,需根据你的occurences实现逻辑调整stationCount的值
内容的提问来源于stack exchange,提问作者KrcnHc
相关产品推荐
相关产品推荐

