Java for循环标签跳转到指定位置

Posted xfcoding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java for循环标签跳转到指定位置相关的知识,希望对你有一定的参考价值。

大家是否见过这种for循环,在for循环前加了个标记的:

outerLoop:
for (; ; ) 
    for (; ; ) 
        break outerLoop;
    

我之前有一次在公司业务代码中见过有这种写法的,没在意,今天在看JDK线程池的代码时,又看到ThreadPoolExecutoraddWorker方法中有这种写法。于是就查了相关资料,也比较简单。

总结下它的用法吧:

  1. 上面代码中的outerLoop是一个标记外层for循环的标签,它可以随便命名。
  2. 该标签主要用于for循环嵌套的情况,结合breakcontinue跳转到外层for循环;

我们知道,break的作用是跳出当前循环,continue的作用是结束本次循环,继续下次循环。如果有双层for循环,在内层的for循环中,想直接跳出所有循环,使用break outerLoop就可以实现;而continue outerLoop的作用是结束外层的本次循环,继续外层的下一次循环。

举个例子:

public static void main(String[] args) 
    String[] strings = "1", "2", "3";

    outerLoop:
    for (String str : strings) 
        for (; ; ) 
            if (str.equals("1")) 
                break;
            
            if (str.equals("2")) 
                continue outerLoop;
            
            if (str.equals("3")) 
                break outerLoop;
            
        
        System.out.println("str.equals(1)");
    
    System.out.println("str.equals(3)");

上面代码中双重for循环,执行逻辑为:

  1. 第一个if跳出当前内层循环,会打印str.equals(1);
  2. 第二个if执行外层for循环的下一次循环;
  3. 最后一次循环,str的值为3,跳出外层循环,结束整个循环,然后打印str.equals(3)

这种for加标签的写法确实很少见,学Java的时候都没学这个东西,实际写业务代码的时候能避免就避免,内层循环能抽就抽个方法。如果业务太复杂抽不了,这种写法也不失为一种策略。

如果if条件满足,如何跳转到for循环中的特定位置?

我有一些图像文件。我正在尝试使用每个文件执行一些计算,如果满足某个条件,我想回到代码中的特定行并再次从那里运行它。但只是再一次。无论第二次是否满足if条件,我都想进入下一次迭代。但是,MATLAB似乎没有goto函数,并且使用goto意味着编程错误,所以我想我只是为了满足if条件的特定'i'值迭代for循环两次。

file = dir('*.jpg');
n = length(file);
for i = 1:n
    *perform some operations on the 'i'th file*
    if 'condition'
        *run the for loop again for the 'i'th file instead of going to the 'i+1'th file*
         i=i-1;
    else
        *go to next iteration*
    end
end

我试图通过将循环中的循环变量'i'更改为'i-1'来对此进行编码,以便在下一次迭代时,'i'th循环将再次重复,但这样做会给出错误的输出,尽管我不知道我的代码中是否存在其他错误,或者内部是否更改了循环变量是导致问题的原因。对此有任何帮助表示赞赏。

答案

for循环替换while循环以获得更多的灵活性。唯一的区别是你必须手动增加i,因此这也允许你不增加i

根据您的新要求,您可以跟踪尝试次数,并在需要时轻松更改:

file = dir('*.jpg');
n = length(file);

i = 1;
attempts = 1; 

while i <= n
    % perform code on i'th file
    success =  doSomething(); % set success true or false;

    if success
        % increment to go to next file
        i = i + 1;

    elseif ~success && attempts <= 2 % failed, but gave it only one try
        % increment number of attempts, to prevent performing 
        attempts = attempts + 1;
    else % failed, and max attempts reached, increment to go to next file
        i = i + 1;
        % reset number of attempts 
        attempts = 1;
    end
end
另一答案

鉴于新的要求,在rinkert's answer之后添加,最简单的方法是在单独的函数中将代码从循环中分离出来:

function main_function

  file = dir('*.jpg');
  n = length(file);
  for i = 1:n
    some_operations(i);
    if 'condition'
      some_operations(i);
    end
  end

  function some_operations(i)
    % Here you can access file(i), since this function has access to the variables defined in main_function
    *perform some operations on the 'i'th file*
  end

end % This one is important, it makes some_operations part of main_function

以上是关于Java for循环标签跳转到指定位置的主要内容,如果未能解决你的问题,请参考以下文章

java标签是啥?continue语句跳转到标签外层怎么回事?break语句跳出标签指定代码块是指啥

如果if条件满足,如何跳转到for循环中的特定位置?

Kotlin返回与跳转

了解锚点

点击跳转到另外一个页面并打开指定js

Java跳出多层循环