You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对存储星期字符串的ArrayList自定义排序:周一在前周五在后

自定义星期列表排序方案

这个需求挺贴合可视化展示的场景的,其实不用手动搞数字映射,有几种更简洁可靠的方式实现,我给你梳理两个常用方案:

方案一:自定义星期顺序列表+Comparator

这种方式逻辑直观,你可以完全掌控星期的排序规则,适合需要灵活调整顺序的场景:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DaySortExample {
    public static void main(String[] args) {
        List<String> days = new ArrayList<>(Arrays.asList("Thursday", "Monday", "Friday", "Wednesday", "Thursday", "Thursday"));
        
        // 定义除了Monday和Friday之外的正常星期顺序
        List<String> normalWeekOrder = Arrays.asList("Monday", "Tuesday", "Wednesday", "Thursday", "Saturday", "Sunday");
        
        days.sort((day1, day2) -> {
            // 优先把Monday放在最前面
            if (day1.equals("Monday")) {
                return day2.equals("Monday") ? 0 : -1;
            }
            if (day2.equals("Monday")) {
                return 1;
            }
            
            // 把Friday放在最后面
            if (day1.equals("Friday")) {
                return day2.equals("Friday") ? 0 : 1;
            }
            if (day2.equals("Friday")) {
                return -1;
            }
            
            // 其他星期按自定义的正常顺序排序
            return Integer.compare(normalWeekOrder.indexOf(day1), normalWeekOrder.indexOf(day2));
        });
        
        System.out.println(days); // 输出:[Monday, Wednesday, Thursday, Thursday, Thursday, Friday]
    }
}

逻辑说明:

  1. 先处理特殊规则:所有Monday直接排最前,所有Friday直接排最后
  2. 剩下的星期按照我们预先定义的normalWeekOrder列表的位置进行比较排序,确保中间部分的顺序符合常规认知

方案二:利用Java内置DayOfWeek枚举(更简洁可靠)

Java自带的java.time.DayOfWeek枚举已经内置了星期的标准顺序,我们可以直接利用它来简化排序逻辑,避免手动维护顺序可能出现的错误:

import java.time.DayOfWeek;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DaySortWithEnum {
    public static void main(String[] args) {
        List<String> days = new ArrayList<>(Arrays.asList("Thursday", "Monday", "Friday", "Wednesday", "Thursday", "Thursday"));
        
        days.sort((day1, day2) -> {
            // 将字符串转换为DayOfWeek枚举(注意:输入字符串需与枚举名称匹配,可通过大小写转换兼容不同输入)
            DayOfWeek d1 = DayOfWeek.valueOf(day1.toUpperCase());
            DayOfWeek d2 = DayOfWeek.valueOf(day2.toUpperCase());
            
            // 优先处理Monday的排序
            if (d1 == DayOfWeek.MONDAY) {
                return d2 == DayOfWeek.MONDAY ? 0 : -1;
            }
            if (d2 == DayOfWeek.MONDAY) {
                return 1;
            }
            
            // 处理Friday的排序
            if (d1 == DayOfWeek.FRIDAY) {
                return d2 == DayOfWeek.FRIDAY ? 0 : 1;
            }
            if (d2 == DayOfWeek.FRIDAY) {
                return -1;
            }
            
            // 其他星期按枚举的自然顺序(Monday → Sunday)排序
            return d1.compareTo(d2);
        });
        
        System.out.println(days); // 输出:[Monday, Wednesday, Thursday, Thursday, Thursday, Friday]
    }
}

优势说明:

  • 不用手动维护星期顺序列表,减少出错概率
  • 枚举自带的compareTo方法直接支持顺序比较,代码更简洁
  • 如果输入的星期字符串有大小写差异(比如monday或FRIDAY),可以通过toUpperCase()或toLowerCase()统一转换后再处理

额外提示

如果你的列表中可能存在不合法的星期字符串,建议在排序前先做过滤或在转换枚举时添加异常处理(比如try-catch),避免程序抛出异常中断执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 06:37:28