Java实现按n行分块后逆序输出各块且块内保持原读取顺序
你的代码存在的问题
- 外层循环逻辑完全无效:你定义的
counter循环没有参与行拆分逻辑,内层循环会一次性把所有读取到的行都存入同一个ArrayList,完全没有实现按固定行数拆分成块的效果 - 反转逻辑不符合需求:
Collections.reverse(list)是将所有行的顺序完全颠倒,而你需要的是仅反转块的排列顺序,每个块内部的行顺序要保持不变 - 块大小硬编码不可扩展:代码中块大小写死为固定值,无法适配不同的块大小输入要求
实现思路
- 按指定块大小
n逐行读取内容,每攒够n行就将这组行作为一个完整的块存入块列表 - 所有行读取完成后,如果还有剩余不足
n行的内容,也作为单独的块存入块列表 - 反转整个块列表的顺序
- 按顺序遍历反转后的块列表,每个块内的行按原有顺序输出即可
修正后的代码
// 增加块大小n作为入参,可灵活适配不同拆分需求 public static void reverseBlock(BufferedReader r, PrintWriter w, int n) throws IOException { // 存储所有块的列表 List<List<String>> blockList = new ArrayList<>(); // 临时存储当前正在攒的块 List<String> currentBlock = new ArrayList<>(); String line; while ((line = r.readLine()) != null) { currentBlock.add(line); // 攒够n行就存入块列表,重置当前块 if (currentBlock.size() == n) { blockList.add(currentBlock); currentBlock = new ArrayList<>(); } } // 最后如果还有剩余不足n行的内容,也存入块列表 if (!currentBlock.isEmpty()) { blockList.add(currentBlock); } // 反转块的排列顺序 Collections.reverse(blockList); // 遍历输出,每个块内部保持原有顺序 for (List<String> block : blockList) { for (String text : block) { w.println(text); } } }
效果验证
以你给出的示例为例:块大小为2,输入为dog、cat、rabbit、bear时,会先生成块列表[["dog","cat"], ["rabbit","bear"]],反转块列表后得到[["rabbit","bear"], ["dog","cat"]],输出结果完全符合预期。
内容的提问来源于stack exchange,提问作者juicerandy
相关产品推荐
相关产品推荐

