Java 你能使用ta jodatime日期时间列表进行二进制搜索吗?

Java 你能使用ta jodatime日期时间列表进行二进制搜索吗?,java,jodatime,Java,Jodatime,我有一个假日对象列表,其中包括一个jodatime DateTime字段。此列表从最早日期到最晚日期手动排序 我想使用二进制搜索来搜索匹配项。我实现了一个比较器,但算法似乎没有朝着正确的方向发展。JodaTimeDateTimes是否不适用于二进制搜索,或者是否需要执行其他操作才能使其正常工作 请注意,我正在使用Collections.binarySearch工具并遵循以下示例: 以下是搜索输出: Date 1: 2015-02-16T00:00:00.000-08:00 Target dat

我有一个假日对象列表,其中包括一个jodatime DateTime字段。此列表从最早日期到最晚日期手动排序

我想使用二进制搜索来搜索匹配项。我实现了一个比较器,但算法似乎没有朝着正确的方向发展。JodaTimeDateTimes是否不适用于二进制搜索,或者是否需要执行其他操作才能使其正常工作

请注意,我正在使用Collections.binarySearch工具并遵循以下示例:

以下是搜索输出:

Date 1:
2015-02-16T00:00:00.000-08:00
Target date:
2014-12-25T00:00:00.000-08:00
no match
Date 1:
2016-10-10T00:00:00.000-07:00
Target date:
2014-12-25T00:00:00.000-08:00
no match
Date 1:
2017-03-31T00:00:00.000-07:00
Target date:
2014-12-25T00:00:00.000-08:00
no match
Date 1:
2017-10-12T00:00:00.000-07:00
Target date:
2014-12-25T00:00:00.000-08:00
no match
Date 1:
2017-11-23T00:00:00.000-08:00
Target date:
2014-12-25T00:00:00.000-08:00
no match
Date 1:
2017-11-24T00:00:00.000-08:00
Target date:
2014-12-25T00:00:00.000-08:00
no match
Date 1:
2017-12-25T00:00:00.000-08:00
Target date:
2014-12-25T00:00:00.000-08:00
no match
-71
比较国:

 class HolidayComparator implements Comparator<Holiday> {
        public int compare(Holiday h1, Holiday h2) {
            System.out.println("Date 1:");
            System.out.println(h1.getDate());
            System.out.println("Target date:");
            System.out.println(h2.getDate());
            if(h1.getDate().equals(h2.getDate())) {
                return 0;
            }
            else {
                System.out.println("no match");
                return -1;
            }
        }
    };
名单:

返回:

The method binarySearch(List<? extends Comparable<? super T>>, T) in the type Collections is not applicable for the arguments (List<Holidays.Holiday>, Holidays.Holiday)

方法binarySearch(ListJodaTime
DateTime
类本身实现了
Comparable
接口,因此您不需要实现
比较器

相反,使用
Collections.binarySearch
只需两个参数:
list
key

您的
比较器的实现可能有错误,如果您发布它,我们可能能够识别它

然而,您的问题是是否可以在二进制搜索中使用
DateTime
,答案是:可以。让内置的
DateTime.compareTo
函数(在超类
AbstractInstant
中实现)执行其工作

附录

正如代码所示,您不是直接比较
DateTime
对象,而是使用
holidaycomarator
比较
Holiday
对象

Comparator
的Javadoc描述了
compare
方法应该返回的内容:

比较order的两个参数。返回一个负整数, 零,或第一个参数小于等于的正整数 到或大于第二个

如果对象相等,则方法仅返回0;如果对象不相等,则返回-1。这是不正确的,并且会混淆
Collections.binarySearch
方法

试试这个:

class HolidayComparator implements Comparator<Holiday> {
    public int compare(Holiday h1, Holiday h2) {
        return h1.getDate().compareTo(h2.getDate());
    }
}
Long.compare
实现为:

长。比较

public static int compare(long x, long y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
公共静态int比较(长x,长y){
回报率(x
JodaTime
DateTime
类本身实现了
Comparable
接口,因此不需要实现
比较器

相反,使用
Collections.binarySearch
只需两个参数:
list
key

您的
比较器的实现可能有错误,如果您发布它,我们可能能够识别它

然而,您的问题是是否可以在二进制搜索中使用
DateTime
,答案是:可以。让内置的
DateTime.compareTo
函数(在超类
AbstractInstant
中实现)执行其工作

附录

正如代码所示,您不是直接比较
DateTime
对象,而是使用
holidaycomarator
比较
Holiday
对象

Comparator
的Javadoc描述了
compare
方法应该返回的内容:

比较order的两个参数。返回一个负整数, 零,或第一个参数小于等于的正整数 到或大于第二个

如果对象相等,则方法仅返回0;如果对象不相等,则返回-1。这是不正确的,并且会混淆
Collections.binarySearch
方法

试试这个:

class HolidayComparator implements Comparator<Holiday> {
    public int compare(Holiday h1, Holiday h2) {
        return h1.getDate().compareTo(h2.getDate());
    }
}
Long.compare
实现为:

长。比较

public static int compare(long x, long y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
公共静态int比较(长x,长y){
回报率(x
根据您更新的代码,`假日是不可比的,所以您不能使用

int index = Collections.binarySearch(Holidays.getAllHolidays(), new Holidays.Holiday(2014, 12, 25, null));
相反,您将
HolidayComparator
更改为使用
日期时间
的内置可比性,例如

class HolidayComparator implements Comparator<Holiday> {
    public int compare(Holiday h1, Holiday h2) {
        return h1.getDate().compareTo(h2.getDate());
    }
};
类HolidayComparator实现Comparator{
公共整数比较(假日h1、假日h2){
返回h1.getDate().compareTo(h2.getDate());
}
};

您应该能够根据更新的代码使用

,'Holiday不可比,因此您不能使用

int index = Collections.binarySearch(Holidays.getAllHolidays(), new Holidays.Holiday(2014, 12, 25, null));
相反,您将
HolidayComparator
更改为使用
日期时间
的内置可比性,例如

class HolidayComparator implements Comparator<Holiday> {
    public int compare(Holiday h1, Holiday h2) {
        return h1.getDate().compareTo(h2.getDate());
    }
};
类HolidayComparator实现Comparator{
公共整数比较(假日h1、假日h2){
返回h1.getDate().compareTo(h2.getDate());
}
};

您应该能够使用

当然,您需要向我们展示您的
比较器
…添加了比较器。可能重复的@Joe手动排序时,我需要对列表进行排序吗?
假日
不可比…当然,您需要向我们展示您的
比较器
…添加了比较器。可能重复对于@Joe,手动排序时我必须对列表进行排序吗?
Holiday
不可比较……谢谢。当我使用两个参数运行它时,我得到一个eclipse错误。(添加到原始帖子中)。为响应您的添加,在答案中添加了更多信息。感谢您提供了非常全面的答案!它是有效的。因此,在这种情况下,我只能对集合使用两个参数。binarySearch还是您需要一个比较器来使用JodaTime的camparison代码?返回小于或大于对于算法的运行是有意义的,但这让我想知道这个例子(也添加到了帖子中)是如何实现的有效。您可以选择其中之一。您还可以使您的假日类具有可比性:
类假日实现可比性
,并使用
HolidayComparator
中现在的代码实现一个
compareTo
方法。我会这样做,因为它更易于使用。当您需要不同的排序时,比较器非常有用比
class HolidayComparator implements Comparator<Holiday> {
    public int compare(Holiday h1, Holiday h2) {
        return h1.getDate().compareTo(h2.getDate());
    }
};