我们如何能够从4内出去循环?
-
26-09-2019 - |
题
您好
我在初学java和我的程序循环有4个:
我的计划是这样的,如果b
是true
,元素将从pointList删除,n
将n--
和我想从所有走出去的for循环,并从第一再来的循环,使l
会l++
,怎么能我做到这一点?与break语句?
for (int l = 0; l < n; l++) {
for (int i = 1; i < (n - 2); i++) {
for (int j = i + 1; j < (n - 1); j++) {
for (int k = j + 1; k < n; k++) {
if (l != i && l != j && l != k) {
boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k));
System.out.println(b);
if (b == true) {
pointList.remove(pointList.get(l);
n--;
break;
}
else
System.out.println(b);
}
}
}
}
}
解决方案
可以使用一个标记符为:
for (int l = 0; l < n; l++) {
foo: for (int i = 1; i < (n - 2); i++) {
for (int j = i + 1; j < (n - 1); j++) {
for (int k = j + 1; k < n; k++) {
if (l != i && l != j && l != k) {
boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k));
System.out.println(b);
if (b == true) {
pointList.remove(pointList.get(l);
n--;
break foo;
}
else
System.out.println(b);
}
}
}
}
}
其他提示
在一个循环中break
语句终止内循环while continue
跳到下一迭代。为了让这两个语句工作在不同的环路内一个你需要使用的标签。像这样的东西应该工作:
outerloop:
for (int l = 0; l < n; l++) {
for (int i = 1; i < (n - 2); i++) {
for (int j = i + 1; j < (n - 1); j++) {
for (int k = j + 1; k < n; k++) {
if (l != i && l != j && l != k) {
boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k));
System.out.println(b);
if (b == true) {
pointList.remove(pointList.get(l);
n--;
continue outerloop;
}
else
System.out.println(b);
}
}
}
}
}
看一看标记break语句
例如这里:分支语句
String valueFromObj2 = null;
String valueFromObj4 = null;
OUTERMOST: for(Object1 object1: objects){
for(Object2 object2: object1){
//I get some value from object2
valueFromObj2 = object2.getSomeValue();
for(Object3 object3 : object2){
for(Object4 object4: object3){
//Finally I get some value from Object4.
valueFromObj4 = object4.getSomeValue();
//Compare with valueFromObj2 to decide either to break all the foreach loop
if( compareTwoVariable(valueFromObj2, valueFromObj4 )) {
break OUTERMOST;
}
}//fourth loop ends here
}//third loop ends here
}//second loop ends here
}//first loop ends here
使用带标签的循环
for (int l = 0; l < n; l++) {
loopa:
for (int i = 1; i < (n - 2); i++) {
for (int j = i + 1; j < (n - 1); j++) {
for (int k = j + 1; k < n; k++) {
if (l != i && l != j && l != k) {
boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k));
System.out.println(b);
if (b == true) {
pointList.remove(pointList.get(l);
n--;
break loopa;
}
else
System.out.println(b);
}
}
}
}
}
,然后从标签的循环破
again:
for (int l = 0; l < n; l++) {
for (int i = 1; i < (n - 2); i++) {
for (int j = i + 1; j < (n - 1); j++) {
for (int k = j + 1; k < n; k++) {
if (l != i && l != j && l != k) {
boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k));
System.out.println(b);
if (b == true) {
pointList.remove(pointList.get(l);
n--;
break again;
}
else
System.out.println(b);
}
}
}
}
}
我同意所有其他的答案。不过,我想指出的是,以exit
另一种是只把这些代码在其自己的日常和使用return
声明打破了整个事情了。你四嵌套循环是其本身非常复杂,它可能不愧为自己的日常反正。
我对需要圈复杂度国防部岗位上工作不超过6对任何一个程序(有一些例外)。这一系列的独立回路的是4,如果你不能找到一个简单的方法来做到这一点,你真的应该扔掉它们在自己的日常只保留谁必须维护这些代码穷人schmucks的理智。
一个第一'快速和肮脏的解决方案将是使用一个stay_into_loops
变量和修改for
环等:
boolean stay_into_loops = true
// here goes the first for loop
for (int i = 1; i < (n - 2) && stay_into_loops ; i++) {
for (int j = i + 1; j < (n - 1) && stay_into_loops ; j++) {
for (int k = j + 1; k < n && stay_into_loops ; k++) {
if (l != i && l != j && l != k) {
boolean b = isOK(pointList.get(l), `pointList.get(i), pointList.get(j), pointList.get(k));`
System.out.println(b);
if (b == true) {
pointList.remove(pointList.get(l);
n--;
stay_into_loops = false;
break;
然而,通常是当遇到这样的事情一个代码的气味。考虑重构代码,因为这将升级为在某一点一团糟。
创建在每个内for循环为自己的出口。结果 下面是一个简单且无痛的解决方案。
bool breakout;
for (int l = 0; l < n; l++)
{
breakout = false;
for (int i = 1; i < (n - 2) && !breakout; i++)
for (int j = i + 1; j < (n - 1) && !breakout; j++)
for (int k = j + 1; k < n && !breakout; k++)
{
if(b == true)
breakout = true;
}
}
所以你看到的breakout
布尔是您的机票出每个内环的,怎么把它在每一个for
声明被检查。
和它得到复位每次第一for
迭代。
不隶属于 StackOverflow