T
- Type of the data.
public class TimeSpanMap<T> extends Object
时间跨度映射可以被看作是一个有序的时间跨度
集合,或者是一个有序的过渡
集合。这两种视图是相互对偶的。一个时间跨度从一个过渡延伸到下一个过渡,而一个过渡将一个时间跨度与下一个时间跨度分开。每个时间跨度包含一个在该时间跨度内有效的条目;如果在该时间跨度内没有有效内容,则该条目可能为空。
TimeSpanMap
的典型用途是保存分段数据,例如在升交点处变化的轨道计数(在这种情况下,条目将是一个Integer
),或者在多个对象之间的可见性状态(在这种情况下,条目将是一个Boolean
),或者每日或每三小时预计将被估计的阻力系数(这就是TimeSpanDragForce
的实现方式)。
时间跨度映射是逐步构建的。首先,它们只包含一个从过去无限延伸到未来无限的时间跨度
。然后逐个添加新条目,与过渡日期关联,以构建完整的映射。过渡日期可以是有效性的开始(调用addValidAfter(Object, AbsoluteDate, boolean)
时),或者是有效性的结束(调用addValidBefore(Object, AbsoluteDate, boolean)
时)。条目通常只在一端添加(主要按时间顺序),但这不是必需的。例如,可以首先设置一个覆盖较大范围(比如一天)的映射,然后使用传播和事件检测器插入中间日期,从而划分出一些部分。这类似于二叉空间分区树的工作方式。
自11.1版本起,此类是线程安全的。
Modifier and Type | Class and Description |
---|---|
static class |
TimeSpanMap.Span<S>
一个时间跨度的持有者。
|
static class |
TimeSpanMap.Transition<S>
保存过渡时间的类。
|
Constructor and Description |
---|
TimeSpanMap(T entry)
创建一个包含单个对象的映射,最初在整个时间线上有效。
|
Modifier and Type | Method and Description |
---|---|
TimeSpanMap.Span<T> |
addValidAfter(T entry, AbsoluteDate earliestValidityDate, boolean erasesLater)
在限制日期之后添加一个有效条目。
|
TimeSpanMap.Span<T> |
addValidBefore(T entry, AbsoluteDate latestValidityDate, boolean erasesEarlier)
在限制日期之前添加一个有效条目。
|
TimeSpanMap.Span<T> |
addValidBetween(T entry, AbsoluteDate earliestValidityDate, AbsoluteDate latestValidityDate)
在两个限制日期之间添加一个有效条目。
|
TimeSpanMap<T> |
extractRange(AbsoluteDate start, AbsoluteDate end)
提取映射的范围。
|
void |
forEach(Consumer<T> action)
对映射的每个非空元素执行操作。
|
T |
get(AbsoluteDate date)
获取指定日期有效的条目。
|
TimeSpanMap.Span<T> |
getFirstSpan()
获取第一个(最早)时间跨度。
|
TimeSpanMap.Transition<T> |
getFirstTransition()
获取第一个(最早)过渡。
|
TimeSpanMap.Span<T> |
getLastSpan()
获取最后一个(最新)时间跨度。
|
TimeSpanMap.Transition<T> |
getLastTransition()
获取最后一个(最新)过渡。
|
TimeSpanMap.Span<T> |
getSpan(AbsoluteDate date)
获取包含指定日期的时间跨度。
|
int |
getSpansNumber()
获取时间跨度的数量。
|
public TimeSpanMap(T entry)
entry
- 条目(最初在整个时间线上有效)
public int getSpansNumber()
时间跨度的数量始终至少为1。过渡的数量始终比时间跨度的数量少1。
public TimeSpanMap.Span<T> addValidBefore(T entry, AbsoluteDate latestValidityDate, boolean erasesEarlier)
随着条目的有效性,它将截断或覆盖已经存在于映射中的相邻条目的有效性。
如果映射已经包含早于latestValidityDate
的过渡,则erasesEarlier
参数控制如何处理这些过渡。假设与条目eₖ关联的时间跨度[tₖ ; tₖ₊₁[将在调用该方法之前(即 tₖ < latestValidityDate
< tₖ₊₁)在latestValidityDate
时有效。
erasesEarlier
为true
,则所有早于tₖ的过渡都将被擦除,而entry
将从过去无限到latestValidityDate
有效erasesEarlier
为false
,则所有早期过渡将被保留,而entry
将从tₖ到latestValidityDate
有效在这两种情况下,现有条目eₖ的时间跨度将被截断,并且仅在latestValidityDate
到tₖ₊₁之间有效。
entry
- 要添加的条目
latestValidityDate
- 条目有效之前的日期
erasesEarlier
- 如果为true,则该条目擦除所有早于latestValidityDate
的现有过渡
public TimeSpanMap.Span<T> addValidAfter(T entry, AbsoluteDate earliestValidityDate, boolean erasesLater)
随着条目的有效性,它将截断或覆盖已经存在于映射中的相邻条目的有效性。
如果映射已经包含晚于earliestValidityDate
的过渡,则erasesLater
参数控制如何处理这些过渡。假设与条目eₖ关联的时间跨度[tₖ ; tₖ₊₁[将在调用该方法之前(即 tₖ < earliestValidityDate
< tₖ₊₁)在earliestValidityDate
时有效。
erasesLater
为true
,则从tₖ₊₁开始的所有后续过渡都将被擦除,而entry
将从earliestValidityDate
到未来无限有效erasesLater
为false
,则所有后续过渡将被保留,而entry
将从earliestValidityDate
到tₖ₊₁有效在这两种情况下,现有条目eₖ的时间跨度将被截断,并且仅在tₖ到earliestValidityDate
之间有效。
entry
- 要添加的条目
earliestValidityDate
- 条目有效之后的日期
erasesLater
- 如果为true,则该条目擦除所有晚于earliestValidityDate
的现有过渡
public TimeSpanMap.Span<T> addValidBetween(T entry, AbsoluteDate earliestValidityDate, AbsoluteDate latestValidityDate)
随着条目的有效性,它将截断或覆盖已经存在于映射中的相邻条目的有效性。
entry
- 要添加的条目
earliestValidityDate
- 条目有效之后的日期
latestValidityDate
- 条目有效之前的日期
public T get(AbsoluteDate date)
预期的复杂度对于连续调用相邻日期为O(1),这是在传播或轨道确定应用中更常见的用法,对于随机调用为O(n)。
date
- 条目必须有效的日期
getSpan(AbsoluteDate)
public TimeSpanMap.Span<T> getSpan(AbsoluteDate date)
预期的复杂度对于连续调用相邻日期为O(1),这是在传播或轨道确定应用中更常见的用法,对于随机调用为O(n)。
date
- 属于所需时间跨度的日期
public TimeSpanMap.Transition<T> getFirstTransition()
public TimeSpanMap.Transition<T> getLastTransition()
public TimeSpanMap.Span<T> getFirstSpan()
public TimeSpanMap.Span<T> getLastSpan()
public TimeSpanMap<T> extractRange(AbsoluteDate start, AbsoluteDate end)
返回的对象将是一个新的独立实例,其中只包含位于指定范围内的过渡。
例如,考虑一个包含对象 O₀ 在 t₁ 之前有效,O₁ 在 t₁ 和 t₂ 之间有效,O₂ 在 t₂ 和 t₃ 之间有效,O₃ 在 t₃ 和 t₄ 之间有效,以及 O₄ 在 t₄ 之后有效的地图。然后,使用介于 t₁ 和 t₂ 之间的 start
日期和介于 t₃ 和 t₄ 之间的 end
日期调用此方法将导致一个新地图,其中包含在 t₂ 之前有效的对象 O₁,在 t₂ 和 t₃ 之间有效的对象 O₂,以及在 t₃ 之后有效的对象 O₃。因此,O₁ 的有效性在过去延长,O₃ 的有效性在未来延长。
start
- 过渡包含在范围内的最早日期(可以设置为 AbsoluteDate.PAST_INFINITY
以保留所有早期过渡)
end
- 过渡包含在范围内的最晚日期(可以设置为 AbsoluteDate.FUTURE_INFINITY
以保留所有晚期过渡)
Copyright © 2002-2023 CS GROUP. All rights reserved.