You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现按n行分块后逆序输出各块且块内保持原读取顺序

你的代码存在的问题
  • 外层循环逻辑完全无效:你定义的counter循环没有参与行拆分逻辑,内层循环会一次性把所有读取到的行都存入同一个ArrayList,完全没有实现按固定行数拆分成块的效果
  • 反转逻辑不符合需求:Collections.reverse(list)是将所有行的顺序完全颠倒,而你需要的是仅反转块的排列顺序,每个块内部的行顺序要保持不变
  • 块大小硬编码不可扩展:代码中块大小写死为固定值,无法适配不同的块大小输入要求
实现思路
  1. 按指定块大小n逐行读取内容,每攒够n行就将这组行作为一个完整的块存入块列表
  2. 所有行读取完成后,如果还有剩余不足n行的内容,也作为单独的块存入块列表
  3. 反转整个块列表的顺序
  4. 按顺序遍历反转后的块列表,每个块内的行按原有顺序输出即可
修正后的代码
// 增加块大小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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:06:04