如何按索引顺序遍历子列表长度不同的二维List?
解决二维List子列表长度不同时的按列遍历问题
嘿,我来帮你搞定这个问题~你的核心困扰是原循环的逻辑逻辑出错了,既没法遍历到长度较长的子列表的后续元素,还暗藏索引越界的风险。
原代码的问题分析
你原来的外层循环条件是:
for(int i =0; i<myList.get(i).size(); i++)
这个逻辑完全走偏了:
i是你想用来表示列索引的变量,但myList.get(i)取的是第i个子列表(行)的长度,这两者根本没有关联。- 当
i增加到2时,myList.get(2).size()是3,但此时去访问myList.get(0).get(2)会直接抛出IndexOutOfBoundsException,因为第一个子列表只有2个元素。 - 最关键的是,原循环只会遍历到第一个子列表的长度(仅2次循环),所以第3列的元素7根本没机会被处理到。
正确的解决方案
要实现按列遍历且兼容子列表长度不同的情况,我们需要:
- 先找到所有子列表中最长的长度,确定需要遍历多少列。
- 外层循环遍历每一列索引,内层循环遍历每个子列表。
- 对每个子列表,检查当前列索引是否在它的有效范围内,有效则输出对应元素。
修正后的完整代码
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<List<Integer>> myList = new ArrayList<>(3); for(int i=0; i < 3; i++) { myList.add(new ArrayList<>()); } myList.get(0).add(1); // 0,0 myList.get(0).add(4); //0,1 myList.get(1).add(2); // 1,0 myList.get(1).add(5); // 1,1 myList.get(2).add(3);// 2,0 myList.get(2).add(6); //2,1 myList.get(2).add(7); //2,2 // 第一步:获取最长子列表的长度,确定需要遍历的列数 int maxColumnCount = 0; for (List<Integer> subList : myList) { if (subList.size() > maxColumnCount) { maxColumnCount = subList.size(); } } // 第二步:按列遍历,兼容子列表长度差异 for (int colIndex = 0; colIndex < maxColumnCount; colIndex++) { for (List<Integer> subList : myList) { // 检查当前子列表是否有该列的元素,避免索引越界 if (colIndex < subList.size()) { System.out.println(subList.get(colIndex)); } } } } }
输出结果
运行这段代码后,就能得到你期望的输出:
1 2 3 4 5 6 7
补充说明
如果你习惯用索引遍历内层循环,也可以把内层循环改成这样,效果完全一样:
for (int colIndex = 0; colIndex < maxColumnCount; colIndex++) { for (int rowIndex = 0; rowIndex < myList.size(); rowIndex++) { List<Integer> subList = myList.get(rowIndex); if (colIndex < subList.size()) { System.out.println(subList.get(colIndex)); } } }
内容的提问来源于stack exchange,提问作者Thomas Delgado
相关产品推荐
相关产品推荐

