对存储星期字符串的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] } }
逻辑说明:
- 先处理特殊规则:所有
Monday直接排最前,所有Friday直接排最后 - 剩下的星期按照我们预先定义的
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
相关产品推荐
相关产品推荐

