TreeMap按行迭代异常:EntrySet方式跳过起始行且数据乱序
解决TreeMap表格数据按行迭代输出的问题
你的核心问题是错误地通过EntrySet遍历列来输出数据,这会导致按列输出所有行,而非按行整合各列数据;同时未处理列数据长度不一致的情况,引发截断、null值问题。以下是修正方案:
问题根源
- EntrySet迭代的是
TreeMap的键值对(即每一列及其所有行数据),而非按行维度整合数据,自然无法实现“迭代1输出各列第一行”的需求。 - 未处理列数据长度不一致的场景:若某列的行数据列表比其他列短,直接按固定索引取值会出现
IndexOutOfBoundsException或null值。
修正思路
- 先确定所有列中最长的行数,确保遍历到所有行数据,避免截断。
- 按行索引从0开始循环,每一行遍历所有列名,取出对应行的数据;若当前列无该行数据,用默认值(如空字符串)替代,避免null。
修正代码示例
import java.util.List; import java.util.TreeMap; public class TableRowIterator { public static void main(String[] args) { // 模拟填充的表格数据 TreeMap<String, List<String>> tableData = new TreeMap<>(); tableData.put("Name", List.of("Alice", "Bob", "Charlie")); tableData.put("Age", List.of("25", "30")); // 该列只有2行数据 tableData.put("City", List.of("New York", "London", "Paris")); // 计算所有列的最大行数,避免数据截断 int maxRowCount = tableData.values().stream() .mapToInt(List::size) .max() .orElse(0); // 按行索引从0开始迭代输出 for (int rowIdx = 0; rowIdx < maxRowCount; rowIdx++) { StringBuilder rowContent = new StringBuilder(); // 遍历所有列(TreeMap会按列名自然排序) for (String colName : tableData.keySet()) { List<String> colData = tableData.get(colName); // 处理当前列无该行数据的情况,避免null或越界 String cellValue = rowIdx < colData.size() ? colData.get(rowIdx) : ""; rowContent.append(colName).append(": ").append(cellValue).append(" | "); } // 移除末尾多余的分隔符 if (rowContent.length() > 0) { rowContent.setLength(rowContent.length() - 3); } System.out.println(rowContent); } } }
代码说明
- 按行迭代:外层循环从
rowIdx=0开始,严格按行顺序输出,解决“起始行随机”的问题。 - 处理列长度不一致:通过
maxRowCount获取最长列的行数,确保所有行都被输出;同时判断rowIdx是否在当前列的列表范围内,避免null值或异常。 - 有序列输出:
TreeMap的keySet()会按列名自然排序,保证每次输出的列顺序一致。
内容的提问来源于stack exchange,提问作者Gopal Prashad
相关产品推荐
相关产品推荐

