您好我正在寻找一种更好的方法来确定使用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));
}
}
我正在使用的是什么但我担心在比较大量日期时它可能会占用大量资源和时间。是否有一种内置的方式来与JodaTime这样做? 谢谢。
答案 0 :(得分:1)
您的代码可以缩减为:
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));
实际上使用JodaTime LocalDate
代替java.util.Date
。
它不会打印索引,但正如您所说,您只想检查是否存在。
答案 1 :(得分:0)
对列表进行排序具有时间复杂度O(n log n)
。如果您只想知道日期是否存在,请将DateComparator
中完成的转换应用于列表中的每个日期以及您要在列表中查找的日期。然后只需使用List.contains
来确定元素是否包含在内。这具有复杂性O(n)
。