假设我的比较器函数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)) {
...
}
}
答案 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()作为降序列表。如果需要,您当然可以在方法中对其进行抽象。