二维序列化数据列转换逻辑的Java实现问题
二维数据列转换的循环实现方案
需求说明
需要把序列化的二维数据,从指定原始列数的结构,转换为目标列数的结构,数据量不固定,必须通过循环实现。示例如下:
- 原始序列化数据:
1-1 1-2 1-3 1-4 1-5 2-1 2-2 2-3 2-4 2-5 - 原始二维结构(5列2行):
1-1 1-2 1-3 1-4 1-5 2-1 2-2 2-3 2-4 2-5 - 期望二维结构(3列4行):
1-1 1-2 1-3 2-1 2-2 2-3 1-4 1-5 2-4 2-5 - 期望序列化结果:
1-1 1-2 1-3 2-1 2-2 2-3 1-4 1-5 2-4 2-5
原代码问题
你写的代码只处理了每行前MAX_COLUMNS个元素,没有循环处理剩余的列块,导致后半部分数据缺失,输出结果只有[1-1, 1-2, 1-3, 2-1, 2-2, 2-3]。
修正后的代码
import java.util.*; public class Main { static int ORIGINAL_COLUMNS = 5; static int TARGET_COLUMNS = 3; static List<String> serialList = new ArrayList<String>() {{ add("1-1"); add("1-2"); add("1-3"); add("1-4"); add("1-5"); add("2-1"); add("2-2"); add("2-3"); add("2-4"); add("2-5"); }}; public static void main(String[] args) throws Exception { List<String> finalList = new ArrayList<>(); // 计算原始数据的行数 int rowCount = serialList.size() / ORIGINAL_COLUMNS; // 按列块循环:每次处理TARGET_COLUMNS列,直到覆盖所有原始列 for (int colStart = 0; colStart < ORIGINAL_COLUMNS; colStart += TARGET_COLUMNS) { // 每个列块内,遍历所有行,取出对应列范围的元素 for (int row = 0; row < rowCount; row++) { // 当前行的起始索引 int rowStart = row * ORIGINAL_COLUMNS; // 计算当前列块的结束索引(避免超出原始列数) int colEnd = Math.min(colStart + TARGET_COLUMNS, ORIGINAL_COLUMNS); // 取出当前行当前列块的元素 for (int col = colStart; col < colEnd; col++) { finalList.add(serialList.get(rowStart + col)); } } } System.out.println(finalList); } }
代码逻辑说明
- 先算出原始数据的行数:总数据量除以原始列数,适配任意行数的情况
- 外层循环按列块拆分:从第0列开始,每次推进
TARGET_COLUMNS列,直到处理完所有原始列 - 中层循环遍历每一行,确保每个列块内先收集完所有行的对应元素,再处理下一个列块
- 内层循环取出当前行当前列块的元素,用
Math.min处理最后一个列块不足目标列数的情况(比如示例里最后一个列块只有2列) - 运行后输出结果:
[1-1, 1-2, 1-3, 2-1, 2-2, 2-3, 1-4, 1-5, 2-4, 2-5],完全符合期望
内容的提问来源于stack exchange,提问作者ほたく
相关产品推荐
相关产品推荐

