Java 使用while循环检查ArrayList中的日期是否介于两个日期之间

Java 使用while循环检查ArrayList中的日期是否介于两个日期之间,java,date,arraylist,while-loop,calendar,Java,Date,Arraylist,While Loop,Calendar,我有以下while循环: while (!inputDateCalendar.after(endYearCalendar) && !vacations.contains(newLesson.getDate())) { // Do stuff } inputDateCalendar和endYearCalendar都是gregorianalendar类型。 vacations是一个ArrayList,其中包含类型为Vacation的项目 public Vacation(St

我有以下
while
循环:

while (!inputDateCalendar.after(endYearCalendar) && !vacations.contains(newLesson.getDate())) {
    // Do stuff
}
inputDateCalendar
endYearCalendar
都是
gregorianalendar
类型。
vacations
是一个
ArrayList
,其中包含类型为
Vacation
的项目

public Vacation(String type, String region, Date startDate, Date endDate, int schoolYear)
{
    this.type = type;
    this.region = region;
    this.startDate = startDate;
    this.endDate = endDate;
    this.schoolYear = schoolYear;
}
newLesson
是一个
Lesson
对象:

public class Lesson {

    private int id;
    private int studentID;
    private String student;
    private String type;
    private Time duration;
    private double price;
    private Date date;
    private Time time;

}
所有这些都设置好了

现在,我试图确保循环只在
inputDateCalendar
不在
endYearCalendar
之后执行,并且
休假
不包含列表中任何
休假
开始日期
结束日期
之间的日期


我知道人们会推荐Joda time,但我现在想这样尝试。

正如Mou所指出的,您似乎有一些类型的问题-我认为您必须遍历假期列表并检查日期:

while(!inputDateCalendar.after(endYearCalendar)) {
    for(Vacation vacation : vacations) {
        if(newLesson.getDate().after(vacation.getStartDate()) && newLesson.getDate().before(vacation.getEndDate()))
            do.stuff();
    }
}

您可以使用用户
Collections2.filter
像这样的东西应该能起作用

private static class LessonPredicate implements Predicate<Vacation> {
    private Lesson lesson;
    public LessonPredicate(Lesson lesson) {
        this.lesson = lesson;
    }

    @Override
    public boolean apply(Vacation vacation) {
        return lesson.getDate().after(vacation.getStartDate()) && lesson.getDate().before(vacation.getEndDate())
    }
}

while(!inputDateCalendar.after(endYearCalendar) && !Collections2.filter(vacations, new LessonPredicate(newLesson)).isEmpty()) {
    do.stuff();
}
私有静态类LessonPredicate实现谓词{
私人课;
公共课(第一课){
这个.课=课;
}
@凌驾
公共布尔应用(假期){
返回lesson.getDate().之后(休假.getStartDate())和&lesson.getDate().之前(休假.getEndDate())
}
}
而(!inputDateCalendar.after(endYearCalendar)和&!Collections2.filter(vacations,newlessonpredicate(newLesson)).isEmpty()){
do.stuff();
}

vacations是度假对象的数组列表,您正在按日期类型在contains中搜索?什么是新课程?问题在哪里?这是Joda时间库而不是YodaSo,你需要确保你的假期列表已排序,假设没有重叠的假期,并且你需要编写一个基于给定日期的二进制搜索方法
contains()
对您没有帮助,它用于查找特定的假期。(a)OP仅在课程不在任何假期内时才想做一些事情。(b) 线性搜索不是很有效。谢谢你,我会在添加一个后尝试这个!所以它会做我想做的。我会让你知道它是否只在课程不在假期列表中时才运行
do.Stuff
。这是线性搜索,非常有效。是的,不是,但没有人要求更有效的方法。