
本文介绍如何将用户输入的星期字符串(如"monday")高效、健壮地转换为对应的整数编号(1–7),并基于该编号实现“加n天”等循环日期计算,避免冗长if链,提升代码可维护性与可扩展性。
本文介绍如何将用户输入的星期字符串(如"monday")高效、健壮地转换为对应的整数编号(1–7),并基于该编号实现“加n天”等循环日期计算,避免冗长if链,提升代码可维护性与可扩展性。
在Java中,将星期字符串映射为整数并非必须依赖大量if-else或switch语句。更优雅、可维护的方式是利用有序集合 + 索引查找,配合模运算实现循环逻辑。核心思路是:将星期按顺序存入List
以下是一个结构清晰、鲁棒性强的实现方案:
import java.util.*;
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();
int dayIndex = getDayIndex(inputDay); // 返回 0–6(对应 Sunday=0, Monday=1...)
if (dayIndex == -1) {
System.out.println("Invalid day name. Please enter a valid weekday.");
return;
}
// 2. 显示操作菜单
System.out.println("\nEnter:\n1 → Return current day\n" +
"2 → Return next day\n" +
"3 → Return previous day\n" +
"4 → Add N days");
int choice = scan.nextInt();
String resultDay = switch (choice) {
case 1 -> capitalizeFirst(DAYS.get(dayIndex));
case 2 -> capitalizeFirst(DAYS.get((dayIndex + 1) % 7));
case 3 -> capitalizeFirst(DAYS.get((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 capitalizeFirst(DAYS.get(newIndex));
}
default -> "Invalid choice";
};
System.out.println("Result: " + resultDay);
scan.close();
}
// 工具方法:根据字符串查找索引(返回0–6),失败返回-1
private static int getDayIndex(String day) {
if (day == null || day.trim().isEmpty()) return -1;
String normalized = day.trim().toLowerCase();
return DAYS.indexOf(normalized);
}
// 工具方法:首字母大写(如 "monday" → "Monday")
private static String capitalizeFirst(String s) {
if (s == null || s.isEmpty()) return s;
return s.substring(0, 1).toUpperCase() + s.substring(1);
}
}✅ 关键优势说明:
- 消除重复判断:不再需要7组if (day.equals(...)),一行DAYS.indexOf(...)即完成映射;
- 大小写不敏感:统一转为小写比较,兼容 "MONDAY"、"monday"、"Monday";
- 循环计算天然支持:利用 (current + offset) % 7 自动处理跨周逻辑(如 Saturday(6) + 3 = 9 % 7 = 2 → Tuesday);
- 边界安全:getDayIndex() 返回 -1 表示无效输入,便于错误处理;
- 可扩展性强:如需支持国际化,只需替换DAYS列表及解析逻辑,主体算法不变。
⚠️ 注意事项:
- List.of() 创建的是不可修改列表(Java 9+),确保数据一致性;若需兼容旧版JDK,可用 Arrays.asList(...) 替代;
- scan.nextInt() 后若紧接着调用 scan.nextLine(),需额外 scan.nextLine() 消费换行符——本例未涉及混合读取,故未添加;
- 实际项目中建议将DAYS封装为枚举(enum DayOfWeek { SUNDAY, MONDAY, ... }),进一步提升类型安全与IDE支持,但对初学者而言,List方案更直观易懂。
掌握这种“字符串→索引→运算→反查”的模式,不仅能解决星期计算问题,还可推广至月份、状态码、配置项等任何有限有序字符串集合的数值化处理场景。










