正序/倒序比较时间序列的优雅方法

4

假设我的比较函数 foo 以时间序列为输入,该序列可以是从小到大或者从大到小的一系列时间。

Foo 可以像这样:

Foo(List<double> timestampList) {
  if (currentTime > previousMaxValueTimestamp) {
    ...
  } else if (curremtTime > previousMinValueTimestamp) {
    ...
  }
}

上述方法适用于正向序列,但不适用于反向序列。我该如何优雅地编写一个适用于两种类型序列的逻辑呢? 下面是我想要达到的效果,但它重复了大部分代码,这并不是期望的结果。
Foo(List<double> timestampList, boolean isForward) {
  if (isForward) {
        if (currentTime > previousMaxValueTimestamp) {
            ...
        } else if (curremtTime > previousMinValueTimestamp) {
            ...
        }
  } else {
        if (currentTime < previousMaxValueTimestamp) {
            ...
        } else if (curremtTime < previousMinValueTimestamp) {
            ...
        }
  }
}

我的当前解决方案如下,这种编码风格是否好?

Foo(List<double> timestampList, boolean isForward) {
    if ((isForward && currentTime > previousMaxValueTimestamp) || (!isForward && currentTime < previousMaxValueTimestamp)) {
        ...
    } else if ((isForward && curremtTime < previousMinValueTimestamp) || (!isForward && currentTime > previousMaxValueTimestamp)) {
        ...
    }
}

这里的所有变量都是时间戳吗?比如currentTime等等?因为这样你就可以简单地使用Timestamp的方法,例如after或before(请参见https://docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html)。 - Emerson Cod
这是我们自定义的时间戳,类型为“double”,而不是通用的Timestamp。 - Stan
排序列表可以吗? - npinti
这是关键部分,我们不希望有额外的开销来对时间戳列表进行排序或处理。 - Stan
1
根据您当前的解决方案,我建议将方法中的条件提取出来并赋予有意义的名称。这将使阅读和理解解决方案变得更加容易。 - Emerson Cod
3个回答

6

我不知道这样的方式是否仍然能够满足您的需求,但通过这种方式,您仍然可以减少更多或更少的结构,并且不会得到过于冗长的代码。

if (isForward ? currentTime > previousMaxValueTimestamp :
    currentTime < previousMaxValueTimestamp)
{

} else if (!isForward ? currentTime < previousMaxValueTimestamp :
           currentTime < previousMinValueTimestamp)
{

}

1
如果您已经按照我怀疑的方式对列表进行了排序,那么您可以简单地使用迭代器:
ListIterator li = a.listIterator(a.size());
while(isForward ? li.hasPrevious() : li.hasNext()) {
  nextItem = isForward ? li.previous() : li.next());
  //do stuff

}

这段内容来源于这里,并进行了编辑以适应您的需求。

如果您的项目未经过预排序,并且可以接受预排序开销,则可以使用Collections.sort(yourList,yourSpecialComparator)提供自己的特殊比较器。


在我的情况下,比较逻辑更加复杂。反向遍历并没有真正起到帮助作用。不过还是谢谢。 - Stan
1
你可以使用 Collections.sort(yourList, yourSpecialComparator) 对列表进行排序,然后使用建议的方法。 - Ofek Ron

1
为了简单起见,使用一个“普通”的比较器,并对降序列表使用 .reverse()。当然,如果需要,可以将其抽象成一个方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接