gpt4 book ai didi

java - Guava 的 Ranges.asSet 输出无限列表

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:01:17 25 4
gpt4 key购买 nike

我正在尝试使用 Guava 的新 Range 获取日期范围功能,通过

Range<Date> dateRange = Ranges.range(start, BoundType.CLOSED, end, BoundType.CLOSED);

我的目标是获取此日期范围内的小时数。所以我创建了一个这样的 DiscreteDomain:

private static final DiscreteDomain<Date> HOURS = new DiscreteDomain<Date>() {

public Date next(Date value) {
return addHours(value, 1);
}

private Date addHours(Date value, int i) {
Calendar cal = Calendar.getInstance();
cal.setTime(value);
cal.add(Calendar.HOUR_OF_DAY, i);
return cal.getTime();
}

public Date previous(Date value) {
return addHours(value, -1);
}

public long distance(Date start, Date end) {
Calendar cal1 = Calendar.getInstance();
cal1.setTime(start);

Calendar cal2 = Calendar.getInstance();
cal2.setTime(end);

return cal2.getTimeInMillis() - cal1.getTimeInMillis();
}

public Date minValue() {
return new Date(Long.MIN_VALUE);
}

public Date maxValue() {
return new Date(Long.MAX_VALUE);
}
};

如果我只是对输出进行系统输出,我会得到闭集

[Thu Feb 24 00:00:00 EST 2011..Thu Feb 24 00:02:00 EST 2011]

但是,我真的想查看范围内的每个小时,所以我尝试了一个 for 循环:

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

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

最佳答案

我认为这可能是由于 Iterator 的行为所致由 ContiguousSet 返回(由 Range.asSet() 返回):

  @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);
}

只有当下一个计算值等于范围的右边界时才会停止。

在您的情况下,您是否尝试过使用 Thu Feb 24 02:00:00 调用它?而不是 Thu Feb 24 00:02:00为您的范围的正确界限?

我认为这种行为是有问题的,可能值得一问 equalsOrThrow()可以更改为检查 left <= right而不是 left == right


此外,您的 distance()方法不正确。根据方法约定,它应该以小时而不是毫秒为单位返回距离。


编辑

综上所述,我相信真正的问题是,根据 DiscreteDomain's文档:

A discrete domain always represents the entire set of values of its type; it cannot represent partial domains such as "prime integers" or "strings of length 5."

在您的情况下,您正试图在每小时日期 上创建一个离散域,这是所有日期的部分域。我认为这是问题的根本原因。当您拥有部分域时,equalsOrThrow方法变得不可靠,它可能会“错过”范围的正确界限。

关于java - Guava 的 Ranges.asSet 输出无限列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6336704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com