Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以正向/反向顺序比较时间序列的优雅方式_Java - Fatal编程技术网

Java 以正向/反向顺序比较时间序列的优雅方式

Java 以正向/反向顺序比较时间序列的优雅方式,java,Java,假设我的比较器函数foo以一个时间序列作为输入,它可以是从小到大或从大到小的一系列时间 Foo可能如下所示: Foo(List<double> timestampList) { if (currentTime > previousMaxValueTimestamp) { ... } else if (curremtTime > previousMinValueTimestamp) { ... } } Foo(列表时间戳列表){ 如果(curr

假设我的比较器函数
foo
以一个时间序列作为输入,它可以是从小到大或从大到小的一系列时间

Foo
可能如下所示:

Foo(List<double> timestampList) {
  if (currentTime > previousMaxValueTimestamp) {
    ...
  } else if (curremtTime > previousMinValueTimestamp) {
    ...
  }
}
Foo(列表时间戳列表){
如果(currentTime>previousMaxValueTimestamp){
...
}else if(currenmtime>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 timestampList,boolean isForward){
如果(isForward){
如果(currentTime>previousMaxValueTimestamp){
...
}else if(currenmtime>previousMinValueTimestamp){
...
}
}否则{
if(currentTime
我目前的解决方案如下。它是好的编码风格吗

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

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

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

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

}
if(isForward?currentTime>previousMaxValueTimestamp:
currentTime<先前的MaxValueTimestamp)
{
}否则如果(!isForward?currentTime
如果您像我怀疑的那样对列表进行排序,只需使用迭代器即可:

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

}
摘自,然后根据您的需要进行编辑


如果您的项目没有预排序,并且您可以承受预排序的开销,那么您可以使用Collections.sort(您的列表,您的SpecialComparator)提供您自己的特殊比较器。

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

这里的所有变量都是时间戳吗?当前时间等?因为您可以简单地使用Timestamp中的方法,例如after或before(请参阅),它是我们自定义的时间戳,“double”类型。不是一般的时间戳。对列表进行排序可以吗?这是关键部分,我们不希望在对时间戳列表进行排序或处理时产生额外的开销。根据您当前的解决方案,我建议在方法中提取条件,以给出有意义的名称。这将使阅读和理解解决方案更加容易在我的情况下,比较逻辑更加复杂。反向遍历并没有真正的帮助。不过谢谢。您可以使用集合对列表进行排序。排序(yourList,yoursecialcomparator)并使用建议的方法。