Java 如何使用joda time确定数组列表中是否存在日期

Java 如何使用joda time确定数组列表中是否存在日期,java,arraylist,jodatime,Java,Arraylist,Jodatime,您好,我正在寻找一种更好的方法,使用JodaTime确定Java中日期列表中是否存在日期。目前我使用的是: private static void dateSearch() { ArrayList<Date> dates = new ArrayList<>(); dates.add(formatDate("2016-08-18T05:18:24")); dates.add(formatDate("2016-08-17T05:18:24"));

您好,我正在寻找一种更好的方法,使用JodaTime确定Java中日期列表中是否存在日期。目前我使用的是:

private static void dateSearch() {
    ArrayList<Date> dates = new ArrayList<>(); 
    dates.add(formatDate("2016-08-18T05:18:24"));
    dates.add(formatDate("2016-08-17T05:18:24"));
    dates.add(formatDate("2016-08-19T17:00:24"));
    Collections.sort(dates);
    Date today=new Date();
    int index=Collections.binarySearch(dates,today,new DateComparator());
    if(index>=0){
        System.out.println("Todays date was found " + index);
    }
}

//Here is the formatDate Function that produces date objects from strings
private static Date formatDate(String dateString) {    
    String format="yyyy-MM-dd";
    LocalDateTime dateTime = LocalDateTime.parse(dateString);
    String dateCreated = dateTime.toString(format);
    Date date = dateTime.toDate();
    return date;
}

//Here is the comparator I am using for the binary search 
private static class DateComparator implements Comparator<Date> {
    private String format="yyyy-MM-dd";

    @Override
    public int compare(Date d1,Date d2){    
        LocalDateTime dt1 = new LocalDateTime(d1);
        LocalDateTime dt2 = new LocalDateTime(d2);    
        return dt1.toString(this.format).compareTo(dt2.toString(this.format));
    }
}
private static void dateSearch(){
ArrayList日期=新建ArrayList();
添加日期(格式日期(“2016-08-18T05:18:24”);
添加日期(格式日期(“2016-08-17T05:18:24”);
添加日期(格式日期(“2016-08-19T17:00:24”);
集合。排序(日期);
今天日期=新日期();
int index=Collections.binarySearch(dates,today,new DateComparator());
如果(索引>=0){
System.out.println(“找到今天的日期”+索引);
}
}
//下面是formatDate函数,它从字符串生成日期对象
私有静态日期格式日期(字符串日期字符串){
字符串格式=“yyyy-MM-dd”;
LocalDateTime-dateTime=LocalDateTime.parse(日期字符串);
字符串dateCreated=dateTime.toString(格式);
Date Date=dateTime.toDate();
返回日期;
}
//这是我用于二进制搜索的比较器
私有静态类DateComparator实现Comparator{
私有字符串格式=“yyyy-MM-dd”;
@凌驾
公共整数比较(日期d1,日期d2){
LocalDateTime dt1=新的LocalDateTime(d1);
LocalDateTime dt2=新的LocalDateTime(d2);
返回dt1.toString(this.format).compareTo(dt2.toString(this.format));
}
}
我使用的方法很有效,但我担心在比较一个大的日期列表时可能会占用很多资源和时间。有没有一种内在的方法可以让JodaTime做到这一点?
谢谢。

您的代码可以缩减为:

List<LocalDate> dates = new ArrayList<>();
dates.add(LocalDateTime.parse("2016-08-18T05:18:24").toLocalDate());
dates.add(LocalDateTime.parse("2016-08-17T05:18:24").toLocalDate());
dates.add(LocalDateTime.parse("2016-08-19T17:00:24").toLocalDate());

System.out.println(dates.stream().anyMatch(LocalDate.now()::equals));
List dates=new ArrayList();
dates.add(LocalDateTime.parse(“2016-08-18T05:18:24”).toLocalDate());
dates.add(LocalDateTime.parse(“2016-08-17T05:18:24”).toLocalDate();
dates.add(LocalDateTime.parse(“2016-08-19T17:00:24”).toLocalDate();
System.out.println(dates.stream().anyMatch(LocalDate.now()::equals));
它实际上使用JodaTime
LocalDate
而不是
java.util.Date


它不打印索引,但正如您所说,您只想检查是否存在。

对列表排序具有时间复杂性
O(n log n)
。如果您只想知道该日期是否存在,请将在
DateComparator
中完成的转换应用于列表中的每个日期以及要在列表中查找的日期。然后只需使用
List.contains
确定是否包含该元素。这具有复杂性
O(n)

为什么要在比较器中将
日期
s转换为
LocaDateTime
Date
也已经实现了
Compariable
,如果你仍然要使用
Date
,为什么还要使用JodaTime?你不应该用搜索时使用的相同比较器对列表进行排序吗?只是个主意,为什么不使用HashMap呢?@bradimus谢谢你的反馈。你是对的。这是个错误@venktavb在这种情况下,我更喜欢使用列表。我的主要目的是找到一种使用JodaTime来完成任务的方法。@task哦,那可能更容易阅读。我认为工厂方法是java.time的一种形式。双冒号不是Java8构造吗?他不会在Java8中使用JodaTime,因为这些类是经过烘焙而成的。谢谢@Jorn。这就是我一直在寻找的。我竭尽全力实现了一些可以用Stream轻松完成的事情。@LAROmega没有明确地说出来,所以我先尝试了一下。这里唯一的问题是,当前日期将通过隐式分配JVM的当前默认时区来确定。默认值会有所不同,即使在运行时也是如此!时区在确定日期时至关重要,因为对于任何给定的时刻,日期在全球各地都因区域而异。最好通过传递一个对象来明确所需/预期的时区。谢谢你,但我想要一个自定义格式的自定义日期搜索,这就是我为什么要这样做的原因。