
本文介绍一种简洁、可维护的方式,将星期字符串(如"monday")映射为对应序号(1–7),并利用取模运算实现任意天数的前后偏移(如周一加4天得周五),避免冗长的if链和硬编码逻辑。
本文介绍一种简洁、可维护的方式,将星期字符串(如"monday")映射为对应序号(1–7),并利用取模运算实现任意天数的前后偏移(如周一加4天得周五),避免冗长的if链和硬编码逻辑。
在Java中,将用户输入的星期字符串(如 "Monday")映射为整型序号(例如 2),是实现日历逻辑(如“当前日+3天”、“前一日”等)的关键一步。直接使用多个 if-else 判断不仅代码臃肿、易出错,而且难以扩展与维护。更专业、更健壮的做法是:借助不可变列表建立字符串与索引的映射关系,并通过标准化输入(如转小写)提升容错性。
✅ 推荐实现方式:基于 List.of() 的索引映射
import java.util.List;
import java.util.Scanner;
public class DayCalculator {
// 按周顺序定义星期列表(小写形式,便于统一比较)
private static final List<String> DAYS = List.of(
"sunday", "monday", "tuesday", "wednesday",
"thursday", "friday", "saturday"
);
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 1. 获取用户输入的星期(不区分大小写)
System.out.print("Please set the day of the week: ");
String inputDay = scan.nextLine().trim();
// 2. 映射为1~7的整数(Sunday=1, Monday=2, ..., Saturday=7)
int dayIndex = DAYS.indexOf(inputDay.toLowerCase());
if (dayIndex == -1) {
System.out.println("Error: Invalid day name. Please enter a valid weekday.");
return;
}
int currentDayValue = dayIndex + 1; // 转为1-based索引
// 3. 提供操作菜单
System.out.println("\nEnter:\n1 → Return current day\n" +
"2 → Next day\n" +
"3 → Previous day\n" +
"4 → Add N days");
int choice = scan.nextInt();
String resultDay = switch (choice) {
case 1 -> capitalize(DAYS.get(dayIndex));
case 2 -> capitalize(DAYS.get((dayIndex + 1) % 7));
case 3 -> capitalize(DAYS.get((dayIndex + 6) % 7)); // 等价于 (dayIndex - 1 + 7) % 7
case 4 -> {
System.out.print("Enter number of days to add: ");
int n = scan.nextInt();
int newIndex = (dayIndex + n) % 7;
yield capitalize(DAYS.get(newIndex));
}
default -> "Invalid choice";
};
System.out.println("Result: " + resultDay);
scan.close();
}
// 工具方法:首字母大写
private static String capitalize(String s) {
if (s == null || s.isEmpty()) return s;
return s.substring(0, 1).toUpperCase() + s.substring(1);
}
}? 核心要点解析
- List.of() 安全高效:JDK 9+ 提供的不可变列表,线程安全、内存紧凑,且 indexOf() 时间复杂度为 O(n),对仅7个元素完全无性能负担。
- 大小写无关处理:统一调用 .toLowerCase(),支持 "MONDAY"、"monday"、"Monday" 等任意大小写组合。
-
环形偏移靠取模:
- 下一天 → (index + 1) % 7
- 上一天 → (index + 6) % 7(避免负数取模问题)
- 加N天 → (index + N) % 7
自动实现“周循环”,无需手动判断 if (b == 7) then Sunday。
- 错误防御:indexOf() 返回 -1 表示未匹配,应显式校验,防止静默失败。
⚠️ 注意事项与进阶建议
- ❗ 输入验证不可省略:实际项目中需检查空输入、空白字符(已用 .trim())、非星期字符串等边界情况。
- ? 可进一步封装为 DayOfWeek 枚举(JDK 8+ java.time.DayOfWeek 更推荐用于生产环境),但本例聚焦基础映射原理。
- ? 若需支持多语言或本地化,可将 DAYS 抽离为资源文件或 Map
,提升可配置性。 - ? 原始代码中 scan.nextInt() 后未消费换行符,可能导致后续 nextLine() 异常——本例虽未复现该问题,但在混合读取时务必注意 scan.nextLine() 清理缓冲区。
通过这种结构化、函数化、面向不变量的设计,你不仅能优雅解决“字符串→整数→运算→反查字符串”的完整闭环,还能为后续扩展(如添加月份、年份计算)打下清晰、可测试的基础。










