在do while循环中有效地检查条件的方法是什么?

3

我正在使用Do While循环,但是我必须在循环的中间测试条件是否满足,以便如果满足条件,它将跳过该部分。有没有一种高效的方法来做到这一点?

例如,我目前有类似以下代码:

do {
    method1;
    if (!condition) 
        method2;
} while (!condition);

编辑:我很抱歉,我认为我一开始没有表述清楚。条件最初是false的,在循环期间,其中一个方法将会把(全局)“条件”设置为true,此时我希望循环立即结束。我认为在循环内测试结束条件很混乱,想知道是否有任何明显的遗漏。


1
我假设你想要在 while 循环的中途离开,即使条件不成立? - Hunter McMillen
是的,那是我想做的,但据我所见,由于循环非常简单,将“break;”添加到其中只会使其更加复杂,因为我仍然必须两次测试条件。 - brent
1
因此,条件得到满足,最好绕过循环并进入下一个周期。 - Roman C
很遗憾,我不认为我在第一篇帖子中正确地解释了情况。方法1和方法2都必须连续循环,直到其中一个设置了条件为true,所以它们都必须在循环中。 - brent
1
@brent 很抱歉,我认为在Java中没有一种简洁的方法来实现这个。重复使用 if 可能是你最好的选择。 - Hunter McMillen
显示剩余2条评论
7个回答

2
请提供有关方法的更多信息。如果您可以从method1 / 2中返回条件,则尝试以下操作:
do {
    method1;
} while (!condition && !method2)

或者,如果你通过引用传递,并且方法返回始终为 true:

while (method1 && !condition && method2 && !condition);

或者:

while (!method1 && !method2);

编辑:如果:

public boolean method1/2 { ... logic ... ; condition = true; return condition;}

这主要取决于你将要做什么。


那看起来是最好的方法。既然似乎没有更有效的改进方法,我会让这些方法返回一个布尔值,并且与第三个代码段中的内容类似。谢谢! - brent
1
如果一个方法返回布尔值将会导致灾难性后果,因为如果该方法返回错误的值,则while循环将一直运行。只需保持代码简单即可。 - Amit Deshpande

2

我猜你想要的是为了效率而避免进行额外的测试,因为"条件"大部分时候都不满足(很多情况下只有1个)...... 这种优化可以通过深入研究method1和method2(或它们处理的数据)并在循环之外添加一个第一个“虚假步骤”来完成,这将仅在第一次禁用method2的处理。看起来是这样的:

prepare_for_loop_entering
do {
   method2
   method1;
} while (!condition);

谢谢,解决问题的方式与Vikdor提出的类似。正如我之前提到的,我在一开始就有类似的代码。然而,在循环中测试条件是必须每次迭代都要做的事情,因此这并不能解决问题。 - brent

0
如果你在所有引用它的地方都使用相同的条件,那么
do {
    method1;
    method2;
} while (!condition);

就像你的 while 循环一样,除非你在 method1 中将其设为 true,否则 condition 将始终为 false(!condition 将为 true)。然后,只要在 method1 中将其设置为 true,你就可以立即使用 break;


那么没有其他选择吗?在方法1或2中的任何时候都可以将条件设置为true。我可以使用break; 但由于循环的简单性,实际上几乎是相同的,如果不是更好,我已经这样做了。但它看起来很混乱,我在这里发布想知道是否有更好的方法 - 但似乎没有。 - brent
1
我不认为有。抱歉。 - 19greg96

0
以下代码怎么样:
if(condition)
break;

这是一种可能性,但如果我理解正确的话,它最终只会添加一行代码。 - brent
1
如果代码中只有一个条件需要考虑,那么 method2 应该在循环外部。是的,额外的代码不会增加任何成本。 - Amit Deshpande

0

这个怎么样:

 while (!condition) {
   method1;
if(!condition)
   method2;
}

1
如果他在method1中将condition设置为true,method2仍然会被访问。 - 19greg96
这个想法是在第一种方法或第二种方法中,最终会在循环中的某个时间将条件设置为true。如果第一个方法已经将其设置为true,我不想执行第二个方法,但必须一直循环这两个方法,直到发生这种情况。 - brent
啊,是的,谢谢。在这种情况下,我使用while循环还是do while循环并不太重要,因为条件在开始时总是为false。代码仍然会重复执行“!condition”部分的代码,我认为这有点混乱,但似乎这是一个不可避免的问题。无论如何,还是谢谢你! - brent

0
这样怎么样:
method1;
while (!condition) {
   method2;
   method1;
}

那和我最初的做法类似,但如果method2将条件设置为true,则程序将无法正常运行。 - brent

0

使用最通用的循环形式:

while (true)
{
    method1;
    if (!condition) break; 
    method2;
} 

进一步解释

带有条件“condition”的while循环与以下代码完全相同:

while (true)
{
    if (condition) break;
    method1;
    method2;
}

而 do-while 循环就像这样:

while (true)
{
    method1;
    method2;
    if (condition) break;
}

我们不想要那些,因此上面的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接