
本文介绍在统计日期数组中出现最频繁的星期几时,当多个星期几出现次数相同时,如何依据“sun→mon→tue→wed→thu→fri→sat”的自然周序返回字典序(即时间顺序)最早的那一个,避免简单覆盖导致逻辑错误。
本文介绍在统计日期数组中出现最频繁的星期几时,当多个星期几出现次数相同时,如何依据“sun→mon→tue→wed→thu→fri→sat”的自然周序返回字典序(即时间顺序)最早的那一个,避免简单覆盖导致逻辑错误。
在实现 mostFrequentDayOfWeek(SimpleDate[] dates) 方法时,核心目标有两个:
- 准确统计每个星期几(如 "Mon"、"Fri")在输入日期数组中出现的频次;
- 公平裁决并列情况:当多个星期几频次相同且均为最高时,不随机返回,而是严格按标准周序("Sun"
原始代码的问题在于:在 else if (count == maxcount) 分支中,错误地每次新建 Vector
✅ 正确解法的关键是:预定义有序的星期列表,并通过 indexOf() 获取各星期几的固有位置值,用于数值化比较。
以下是优化后的完整实现(已去除冗余 Vector、修复边界逻辑、提升可读性与健壮性):
import java.util.Arrays;
import java.util.List;
public static String mostFrequentDayOfWeek(SimpleDate[] dates) {
if (dates == null || dates.length == 0) {
throw new IllegalArgumentException("Dates array cannot be null or empty");
}
// 定义标准星期顺序:索引越小表示越“早”(Sun 为第 0 天)
List<string> weekOrder = Arrays.asList("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
int maxCount = 0;
int minIndex = Integer.MAX_VALUE; // 记录当前最优星期在 weekOrder 中的索引
String resultDay = "";
for (SimpleDate date1 : dates) {
String day1 = dayOfWeek(date1);
int count = 0;
// 统计 day1 出现次数
for (SimpleDate date2 : dates) {
if (day1.equals(dayOfWeek(date2))) {
count++;
}
}
int currentIndex = weekOrder.indexOf(day1);
// 若频次更高 → 直接更新
if (count > maxCount) {
maxCount = count;
minIndex = currentIndex;
resultDay = day1;
}
// 若频次相等 → 仅当当前星期“更早”(索引更小)时才更新
else if (count == maxCount && currentIndex <p>? <strong>关键设计说明</strong>: </p>
<ul>
<li>使用 Arrays.asList(...) 构建不可变但高效查找的星期顺序列表,indexOf() 时间复杂度为 O(1)(因列表长度恒为 7); </li>
<li>引入 minIndex 变量替代字符串比较,避免 "Fri".compareTo("Mon") 等字典序误判(注意:"Fri" 字典序小于 "Mon",但时间上更晚!),确保严格按日历顺序裁决; </li>
<li>增加空数组/null 校验,符合生产级方法健壮性要求; </li>
<li>内层循环保持 O(n²) 时间复杂度(适用于中小规模数据),若需高性能可升级为 Map<string integer> 单次遍历统计(O(n)),再遍历 Map 比较频次与顺序。</string>
</li>
</ul>
<p>? <strong>注意事项</strong>: </p>
<ul>
<li>请确保 dayOfWeek(SimpleDate) 方法始终返回上述 7 个标准缩写之一(大小写敏感),否则 weekOrder.indexOf(...) 将返回 -1,引发逻辑错误; </li>
<li>当所有日期对应同一星期几时,该方法仍正确返回该值; </li>
<li>若存在无效日期导致 dayOfWeek() 抛异常,请在外层统一捕获处理,本方法聚焦于频次与顺序逻辑。</li>
</ul>
<p>综上,通过将“星期语义顺序”显式建模为索引序号,我们以简洁、可读、可验证的方式解决了并列场景下的确定性返回问题——这正是专业工具方法应有的严谨性与工程意识。</p></string>










