【问题标题】:Elegant way to compare time sequence in forward/reverse order以正向/反向顺序比较时间序列的优雅方式
【发布时间】:2016-02-11 00:41:51
【问题描述】:

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

【问题讨论】:

  • 这里的变量都是 Timestamps 吗?当前时间等?因为那样你就可以简单地使用来自 Timestamp 的方法,例如 after 或 before(参见 docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html
  • 这是我们自定义的时间戳,“double”类型。不是一般的时间戳。
  • 排序列表有用吗?
  • 这是关键部分,我们不希望额外的开销来排序或处理时间戳列表。
  • 根据您当前的解决方案,我建议提取方法中的条件以提供有意义的名称。这将使阅读和理解解决方案变得更加容易

标签: java


【解决方案1】:

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

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

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

}

【讨论】:

    【解决方案2】:

    如果您按照我怀疑的方式对列表进行了排序,则可以简单地使用迭代器:

    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) 来提供您自己的特殊比较器。

    【讨论】:

    • 就我而言,比较逻辑更复杂。反向遍历并没有真正帮助。不过还是谢谢。
    • 您可以使用 Collections.sort(yourList,yourSpecialComparator) 对列表进行排序,并使用建议的方法。
    【解决方案3】:

    简单地说,有一个“正常”比较器,并使用 .reverse() 降序列表。如果需要,您当然可以将其抽象为方法。

    【讨论】:

      猜你喜欢
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      相关资源
      最近更新 更多