如何遍历嵌套ArrayList并将Pessoal实例存入指定数组?
如何嵌套遍历ArrayList并将元素存入数组
问题背景
我有一个存储Pessoal类型实例的数组:
Pessoal[] teste = new Pessoal[6];
另外有两个ArrayList,都被存入了另一个ArrayList中:
static ArrayList<Pessoal> lista_de_profs; // 包含4个Pessoal实例 static ArrayList<Pessoal> lista_de_infos; // 包含2个Pessoal实例,总数与teste数组长度6匹配 // 两个ArrayList中存储的都是Pessoal类型实例
ArrayList<ArrayList<Pessoal>> lista_de_docentes = new ArrayList<>(); lista_de_docentes.add(lista_de_profs); lista_de_docentes.add(lista_de_infos);
我需要遍历lista_de_docentes中的所有子ArrayList,取出里面的Pessoal实例并存入teste数组。目前我只能实现单个ArrayList的数据存入数组(当teste长度为4时可行):
for (int i = 0; i < teste.length; i++){ teste[i] = lista_de_profs.get(i); }
但这段代码只处理了一个ArrayList,我需要处理lista_de_docentes里的所有子集合。
注:部分变量为葡萄牙语命名,可替换为英文(比如lista_de_profs改为professorsList,lista_de_infos改为infosList,lista_de_docentes改为teachersList)
解决方案
方法一:嵌套循环+索引追踪
用外层循环遍历lista_de_docentes里的每个子ArrayList,内层循环遍历子ArrayList的元素,同时用单独的索引变量记录teste数组的当前存入位置:
int arrayIndex = 0; // 追踪teste数组的当前存入位置 // 外层循环遍历每个子ArrayList for (ArrayList<Pessoal> subList : lista_de_docentes) { // 内层循环遍历子ArrayList中的每个Pessoal实例 for (Pessoal pessoa : subList) { teste[arrayIndex] = pessoa; arrayIndex++; } }
这种方法逻辑清晰,适配所有Java版本,能确保元素按顺序存入数组(先存lista_de_profs的4个元素,再存lista_de_infos的2个元素)。
方法二:Java 8+ 流操作(更简洁)
如果使用Java 8及以上版本,可通过流的扁平化操作简化代码:
// 将嵌套的ArrayList扁平化为单个Stream,再转为数组 Pessoal[] result = lista_de_docentes.stream() .flatMap(List::stream) // 扁平化所有子集合的元素 .toArray(Pessoal[]::new); // 存入已有的teste数组 System.arraycopy(result, 0, teste, 0, result.length);
或者直接在流操作中完成赋值:
int[] index = {0}; // 用数组包装索引,适配lambda对变量的引用要求 lista_de_docentes.stream() .flatMap(List::stream) .forEach(pessoa -> teste[index[0]++] = pessoa);
注意事项
- 确保
teste数组的长度等于所有子ArrayList的元素总数,否则会抛出ArrayIndexOutOfBoundsException异常。 - 上述两种方法都会保持元素的原有顺序(外层循环的顺序+子ArrayList内部的顺序)。
内容的提问来源于stack exchange,提问作者OrlandoVSilva
相关产品推荐
相关产品推荐

