2010-10-20 33 views
2

只是一个简单的问题,比如说Car类扩展了HashMap(String,String)。要在for循环中使用break吗?

1.

for (Car car : carList) { 
    if (car.isEmpty) { 
     break; 
    } 
    doSomething(); 
} 

2.

for (Car car : carList) { 
    if (!car.isEmpty) { 
     doSomethingElse(); 
    } 
} 

使上述2个比较好? 谢谢。

----编辑---- 对不起,我没有说清楚我的观点。

doSomething()方法实际上是在做不同的事情。 我已将它们更改为doSomething()和doSometingElse()。

我的问题是,你会把所有的过程在一个if()?或者如果if()条件不满足,则首先中断循环。

谢谢。

+0

什么是你想做?这两个循环做不同的事情。第一个循环会在找到第一个空车后导致调用doSomething()。第二个循环为每个非空车调用'doSomething()'。根据你需要做什么,我可以推荐一个'while'循环或'for'循环。 – 2010-10-20 01:39:34

+1

“哪个更好”是主观的,尤其是当上面的例子做不同的事情时...告诉我们你期望的结果是什么,我们可以更好地决定哪个会满足这个,因此“更好” – MadMurf 2010-10-20 01:41:06

+0

对不起,我没有说出我的观点清楚,我已经编辑了帖子,谢谢 – Gnavvy 2010-10-20 01:45:06

回答

0

如果你的意思是“继续”而不是“休息”,那么我会说不使用继续或休息更好。

这不是一个大问题,但像继续,休息和返回等语句基本上都是goto语句,它们已经打扮了一下。他们并没有得到一条线或转到一个标签,而是转向了控制结构的顶部或底部 - 这使得程序员在追踪它时必须考虑一下,这意味着浪费时间和更多的错误机会。

这不是什么大不了的事情,很多时候这些结构实际上会澄清你的代码,但是如果你有选择,而且他们似乎基本上做了同样的事情,那就不要在别处发送控制。

+0

谢谢比尔。我正在考虑休息,因为它只是让代码更容易阅读。 – Gnavvy 2010-10-20 01:49:57

+0

我认为在这种情况下代码更少可读性比更多的代码(使用break语句)更可读。通过反转条件并且不需要中断/继续,可以减少代码。 – 2010-10-20 02:26:10

+0

@matt b实际上,“少代码更具可读性”是一种谬误,除非你正在谈论20行代码。将一条紧凑的线条更改为两条或三条线将几乎总是更具可读性(当我每次看到“富有表现力”这个词时,都会畏缩)。 – 2010-10-20 16:48:03

1

他们做了完全不同的事情。第一辆会在看到第一辆空车后停工。第二个版本将为每辆非空车辆“做点事情”。我想,你可能想使用continue而不是break

8

他们做了完全不同的事情。只要条件成立,前者将停止迭代,而后者只会在条件为假的迭代期间跳过处理。

首先将break更改为continue将使它们以相同的方式工作。

+0

对不起,我没有明确我的观点,我编辑了这篇文章,谢谢 – Gnavvy 2010-10-20 01:43:59

+0

除了第二个调用dosomethingelse()前者称dosomething()。 – Matt 2010-10-20 01:44:54

0

这两个循环不会做同样的事情

  1. 将终止循环第一次发现空车厢用的isEmpty第一空单后跳过任何汽车。如果将'break'更改为'continue'

  2. 将会为所有非空车辆做一些事情。

+0

谢谢你的回答。对不起,我没有明确表达我的观点,我已编辑帖子,谢谢 – Gnavvy 2010-10-20 01:46:38

0

取决于你想要做什么,第一个循环将在条件满足时立即结束,而第二个循环将通过所有散列映射进行迭代。

0

如果你想要基于汽车是否为空的不同行为,你可以使用if else语句。如果您想停止迭代carList,请使用break。

for (Car car : carList) { 
    if (car.isEmpty) { 
     doSomething(); 
    } 
    else { 
     doSomethingElse(); 
    } 
} 
0

正如大家都指出的那样,break版本会提前退出。 答案取决于你想要做什么。

如果你已经完成了你需要做的事情,那么一旦你完成了就会发生。为什么要浪费CPU周期?另一方面,如果你必须通过整个名单dosomethingelse()然后不爆发。

你打算有两个不同的命名函数吗?或者他们都应该被称为dosomething()?

0

这是你在找什么?

for (Car car : carList) { 
    if (car.isEmpty) { 
     doSomething(); 
    } 
    else { 
     doSomethingElse(); 
    }  
} 

或者,你在找

for (Car car : carList) { 
    if (car.isEmpty) { 
     break; 
     //STOP ITERATING THROUGH THE REST OF THE LIST 
     //(doSomething & soSomethingElse may have been called a few times already) 
    } 
    else { 
     doSomething(); 
    } 
    doSomethingElse(); 
} 

还有其他的选择还有,你的澄清仍然是不明确......我反正...

+0

感谢MadMurf,你的回答是对的。我只是想将doSomethingElse()移出if()部分。 paxdiablo的评论中的帖子就是我正在寻找的内容。 – Gnavvy 2010-10-20 02:00:46