优雅的方式来比较正向/反向顺序的时间顺序

时间:2015-11-10 07:32:44

标签: java

假设我的比较器函数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)) {
        ...
    }
}

3 个答案:

答案 0 :(得分:6)

我不知道这样的事情是否仍会让你满意,但是通过这种方式,你仍然可以减少或多或少的结构,你就不会得到这个膨胀的代码

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

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

}

答案 1 :(得分:1)

如果您按照我怀疑的方式对列表进行了排序,则只需使用迭代器:

ListIterator li = a.listIterator(a.size());
while(isForward ? li.hasPrevious() : li.hasNext()) {
  nextItem = isForward ? li.previous() : li.next());
  //do stuff

}

取自here,然后进行修改以满足您的需求

如果你的项目没有预先排序,你可以使用预排序开销,你可以使用Collections.sort(yourList,yourSpecialComparator)提供你自己的特殊比较器。

答案 2 :(得分:1)

对于简单地说,有一个“普通”比较器,并使用.reverse()作为降序列表。如果需要,您当然可以在方法中对其进行抽象。