我需要将下一个元素与之前的元素相匹配。在条件我想continue
迭代。但我不喜欢将作业复制/粘贴到上一个元素:
List<Type> all;
Type prev = null;
for (Type curr : all) {
if (prev == null) {
prev = curr;
continue;
}
if (isBad(curr)) {
prev = curr;
continue;
}
if (! curr.match(prev)) {
prev = curr;
continue;
}
process(prev, curr);
prev = curr;
}
如何避免prev = curr
重复?
我认为这个解决方案:
for (Type curr : all) {
if (prev != null && !isBad(curr) && curr.match(prev)) {
process(prev, curr);
}
prev = curr;
}
是作弊,因为process(prev, curr);
不应该缩进。错误检查逻辑不应该打扰主执行逻辑(强制缩进)。
答案 0 :(得分:2)
你可以使用索引的for循环,这样你就可以阅读&#39;提前&#39;并且你不应该使用前一个变量,在这种情况下,i的最后一个值必须是size-1。
List<Type> all;
Type prev = null;
for(int i=0; i<all.size()-1; i++) {
if(isBad(all.get(i)) {
continue;
}
if(all.get(i).match(all.get(i+1)) {
continue;
}
...
}
答案 1 :(得分:1)
您可以通过组合3 if语句来消除continue语句并使代码更清晰:
for (Type curr : all) {
if (prev != null && !isBad(curr) && curr.match(prev)) {
process(prev, curr);
}
prev = curr;
}
答案 2 :(得分:1)
为什么不使用OR(||)。
即
if (prev == null || isBad(curr) || ! curr.match(prev) ) {
prev = curr;
continue;
}
答案 3 :(得分:1)
全部删除&#34;继续&#34;来自你的剧本。
通过使用&#34;将if语句链接在一起来执行此操作;否则,如果&#34;并在最后的else块中使用process(),或者通过组合条件并交换块来实现:
for (Type curr : all) {
if (prev != null &&
!isBad(curr) &&
curr.match(prev)) {
process(prev, curr);
}
prev = curr;
}
或
for (Type curr : all) {
if (prev != null) {
}
else if (isBad(curr)) {
}
else if (! curr.match(prev)) {
}
else {
process(prev, curr);
}
prev = curr;
}
答案 4 :(得分:1)
只需使用OR(||)并将条件放在具有相关名称的方法中:
public void myMethod(){
List<Type> all;
Type prev = null;
for (Type curr : all) {
if (isContinue()) {
prev = curr;
continue;
}
process(prev, curr);
prev = curr;
}
}
private boolean isContinue(){
return (prev == null || isBad(curr) || !curr.match(prev);
}
答案 5 :(得分:1)
我想:
List<Type> all;
Type prev = null;
Type curr = null;
Iterator<Type> iter = all.iterator();
for (; iter.haSNext(); prev = curr) {
curr = iter.next();
if (prev == null)
continue;
if (isBad(curr))
continue;
if (! curr.match(prev))
continue;
process(prev, curr);
}
我写了blog post about this topic with more detailed examples。
因此,我发现Java miss goto
语句,使用强制限制的实现将是微不足道的。
答案 6 :(得分:0)
据我所知,你在所有的if-s中做同样的事情。因此,您可以使用||
中的if
:
for (Type curr : all) {
if (prev == null || isBad(curr) || ! curr.match(prev)) {
prev = curr;
continue;
}
process(prev, curr);
prev = curr;
}