Java 番石榴';s Ranges.asSet输出无限列表

Java 番石榴';s Ranges.asSet输出无限列表,java,guava,date-range,Java,Guava,Date Range,我正在尝试使用Guava的新功能,通过 Range<Date> dateRange = Ranges.range(start, BoundType.CLOSED, end, BoundType.CLOSED); 但是,我确实希望看到范围内的每个小时,因此我尝试了一个for循环: for (Date hour : hours) { System.out.println(hour); } 当运行这个块时,我似乎得到了一个无限集,从范围的左侧开始,但没有在右侧停止,这使我杀死了

我正在尝试使用Guava的新功能,通过

Range<Date> dateRange = Ranges.range(start, BoundType.CLOSED, end, BoundType.CLOSED);
但是,我确实希望看到范围内的每个小时,因此我尝试了一个for循环:

for (Date hour : hours) {
    System.out.println(hour);
}

当运行这个块时,我似乎得到了一个无限集,从范围的左侧开始,但没有在右侧停止,这使我杀死了IDE。我做错了什么?

我认为这可能是由于
连续集
返回的
迭代器
的行为造成的(由
Range.asSet()
返回):

@重写公共不可修改迭代器迭代器(){
返回新的AbstractLinkedeter(first()){
最终C last=last();
@凌驾
受保护的C computeNext(C上一个){
return equalsOrThrow(上一个,最后一个)?null:domain.next(上一个);
}
};
}
私有静态布尔值equalsOrThrow(可比左,
@可撤销(可比权利){
返回right!=null&&compareOrThrow(左、右)==0;
}
专用静态int compareOrThrow(可比左、可比右){
返回左侧。比较(右侧);
}
仅当下一个计算值等于范围的右边界时,它才会停止

在您的情况下,您是否尝试过使用
Thu Feb 24 02:00:00
而不是
Thu Feb 24 00:02:00
来调用范围的右边界


我认为这种行为是有问题的,值得一问的是,是否可以将
equalsOrThrow()
更改为检查
left我刚刚尝试了这个方法,效果很好@eneveu已经指出了您的
distance
方法的问题。我还猜测
开始
结束
之间在毫秒级上有一些细微的差别,这意味着通过在
开始
上增加小时,你永远不会得到一个
日期
等于
结束

然而,这仅仅是以一种非设计工作方式使用类的症状。
离散域的Javadoc声明:

离散域始终表示其类型的整个值集;它不能表示部分域,例如“素整数”或“长度为5的字符串”


“小时”的
离散域
并不代表所有可能的
日期
对象的域,因此违反了其合同。

花了太多时间编辑我的答案,我看到你已经编辑了你的答案,提到了部分域问题!啊哈,是的,我刚发帖就想到了这一点,重新检查了离散域的javadoc。。。我对编辑按钮有点兴奋。很抱歉。虽然我想我们的答案是互补的,涵盖了整个领域;)我想知道当Guava看到迭代器的下一个元素严格大于上限(这表明离散域存在问题)时,它是否值得抛出一个
IllegalStateException
[Thu Feb 24 00:00:00 EST 2011..Thu Feb 24 00:02:00 EST 2011]
for (Date hour : hours) {
    System.out.println(hour);
}
  @Override public UnmodifiableIterator<C> iterator() {
    return new AbstractLinkedIterator<C>(first()) {
      final C last = last();

      @Override
      protected C computeNext(C previous) {
        return equalsOrThrow(previous, last) ? null : domain.next(previous);
      }
    };
  }

  private static boolean equalsOrThrow(Comparable<?> left,
      @Nullable Comparable<?> right) {
    return right != null && compareOrThrow(left, right) == 0;
  }

  private static int compareOrThrow(Comparable left, Comparable right) {
    return left.compareTo(right);
  }