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
相关产品推荐
相关产品推荐

