如何解决根据特定值对 ArrayList<DayOfWeek> 进行排序
我有一个 ArrayList<DayOfWeek>
比方说 ["MONDAY","WednESDAY","FRIDAY"]
我的目标是以循环方式根据 DayOfTheWeek
对其进行排序。
输入:"WednESDAY"
排序列表:["WednESDAY","FRIDAY","MONDAY"]
该列表保证从周一到周日排序。不能保证输入的日期在列表中,在这种情况下,排序从列表中存在的下一个值开始。
解决方法
我建议使用类似的方法:
how to order Arrays value as circular format in java?
其中每个 DayOfWeek
都有自己的 ID 编号,对应于其在排序中的预期位置,因此您可以围绕这些编号旋转。
Collections#rotate
演示:
import java.time.DayOfWeek;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<DayOfWeek> list = new ArrayList<>(List.of(DayOfWeek.MONDAY,DayOfWeek.TUESDAY,DayOfWeek.WEDNESDAY,DayOfWeek.THURSDAY,DayOfWeek.FRIDAY,DayOfWeek.SUNDAY));
Collections.rotate(list,list.size() - list.indexOf(DayOfWeek.WEDNESDAY));
System.out.println(list);
}
}
输出:
[WEDNESDAY,THURSDAY,FRIDAY,SUNDAY,MONDAY,TUESDAY]
互动:
import java.time.DayOfWeek;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
List<DayOfWeek> list = new ArrayList<>(List.of(DayOfWeek.MONDAY,DayOfWeek.SUNDAY));
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the day: ");
String day = scanner.nextLine();
try {
Collections.rotate(list,list.size() - list.indexOf(DayOfWeek.valueOf(day.toUpperCase())));
System.out.println(list);
} catch (IllegalArgumentException e) {
System.out.println("Invalid input");
}
}
}
示例运行:
Enter the day: wednesday
[WEDNESDAY,TUESDAY]
,
其他答案已经给出了正确的想法:使用 Collections.rotate()
。这只是为了考虑评论中的信息:
该列表保证从周一到周日排序。这 不保证输入日期在列表中,在这种情况下 排序从列表中的下一个值开始。
ArrayList<DayOfWeek> list = new ArrayList<>(List.of(
DayOfWeek.MONDAY,DayOfWeek.FRIDAY));
DayOfWeek input = DayOfWeek.TUESDAY;
int indexOfDesiredFirstDay = Collections.binarySearch(list,input);
if (indexOfDesiredFirstDay < 0) {
indexOfDesiredFirstDay = -indexOfDesiredFirstDay - 1;
}
Collections.rotate(list,-indexOfDesiredFirstDay);
System.out.println(list);
本例中的输出:
[星期三、星期五、星期一]
由于列表永远不会超过7个元素,所以我们不需要二分查找的效率,但是Collections.binarySearch()
仍然是一种方便的方法,可以找到我们想要排在第一位的元素的索引回转。 rotate()
接受负的旋转量,因此我们只需否定(反转其符号)索引并将其传递给该方法。计算出的索引可能超出了列表的末尾,但 rotate()
也可以处理,所以没关系。
由于输入列表中可能缺少输入的日期,因此需要使用Collections.rotate
对工作日的完整列表进行排序,然后通过输入列表进行过滤:
public static List<DayOfWeek> orderWithDayFirst(DayOfWeek first,List<DayOfWeek> dows) {
List<DayOfWeek> fullWeek = Arrays.asList(DayOfWeek.values());
Collections.rotate(fullWeek,-first.ordinal());
return fullWeek.stream().filter(dows::contains).collect(Collectors.toList());
}
测试:
// Sunday is available
System.out.println(orderWithDayFirst(
DayOfWeek.SUNDAY,Arrays.asList(DayOfWeek.MONDAY,DayOfWeek.SATURDAY,DayOfWeek.SUNDAY,DayOfWeek.TUESDAY)));
System.out.println("====");
// No Friday
System.out.println(orderWithDayFirst(
DayOfWeek.FRIDAY,DayOfWeek.TUESDAY)));
输出
[SUNDAY,TUESDAY,SATURDAY]
====
[SATURDAY,TUESDAY]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。