You need to enable JavaScript to run this app. Java实现ASCII日历按固定宽度逐行截断打印事件字符串
优惠活动
大模型
产品
解决方案
定价
更多

Java实现ASCII日历按固定宽度逐行截断打印事件字符串

ASCII日历事件文本分段打印实现

需求匹配说明

  • 单格可用打印宽度固定为 单元格总宽度-1,即单元格宽5时单格每次打4个字符
  • 依托现有逐行循环的程序结构,用可重复执行的语句完成长文本自动截断换行,不需要提前对事件文本做全量拆分
  • 输出效果完全匹配示例:长事件按固定宽度逐段填充到对应单元格的每一行,剩余空位自动补空格

核心逻辑修改点

1. 补全基础状态缺陷

原代码存在两个会导致逻辑失效的问题:

  • 事件检查时传入的day变量没有随7列的循环动态更新,会导致所有单元格检查同一天的事件
  • 逐行打印时没有记录每个列的事件文本打印进度,每次循环都会从头截断字符串,无法实现跨行输出
    可以提前定义长度为7的整型数组colTextOffset,初始值全为0,用来记录每一列当前已经打印到事件文本的第几个字符。

2. 替换核心打印逻辑

将原代码中标注的待修改区域,替换为带偏移量的逐字符打印逻辑:

// 计算当前列对应的实际日期,替代原代码中错误的day传值
int currentCellDay = getCurrentColumnDay(h /* h为当前列序号,取值1到7 */);
// 获取当前日期绑定的完整事件文本,无事件则返回null
String fullEventText = getEventByDate(month, currentCellDay);
// 单格最大可打印字符数 = 单元格宽度 -1
int lineMaxChar = Width - 1;

// 循环填充单格内的字符
for (int f = 0; f < lineMaxChar; f++) {
    int currentOffset = colTextOffset[h - 1];
    // 有事件且当前偏移量未超出文本长度时,打印对应字符
    if (fullEventText != null && currentOffset < fullEventText.length()) {
        System.out.print(fullEventText.charAt(currentOffset));
        colTextOffset[h - 1]++;
    } else {
        // 无内容时补空格填满单元格宽度
        System.out.print(" ");
    }
}

3. 循环运行的自动换行效果

因为程序本身就是逐行遍历所有单元格做打印的:

  • 每跑完一次7列的内层循环,相当于对每个事件按Width-1的长度切出一段输出
  • 下一轮外层循环执行时,因为colTextOffset已经记录了上次的打印位置,会自动从上次截断的位置继续打印后续字符
  • 直到事件文本全部打完,后续行自动填充空格,不需要额外编写文本拆分的代码

举个实际效果对应:单元格宽度为10,单段可打9个字符,事件文本为St. Patricks day

  • 第一行单元格:从偏移0开始打9个字符,输出St. Patri,偏移量走到9
  • 第二行单元格:从偏移9开始打,输出ks day ,正好和示例效果完全一致

代码结构修正

  • 打印事件行的循环,每一次循环打印完一行所有列的内容后再换行,不要在单格打印过程中执行System.out.println()
  • 月份切换时要重置colTextOffset数组的所有值为0,避免跨月的事件偏移量残留

内容的提问来源于stack exchange,提问作者zPushz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 14:06:00