Eu tenho uma construção de loop aninhado como este:
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
// Do something and break...
break; // Breaks out of the inner loop
}
}
}
Agora, como posso sair dos dois loops? Eu olhei para perguntas semelhantes, mas nenhuma diz respeito especificamente ao Java. Não pude aplicar essas soluções porque a maioria usava gotos.
Não quero colocar o loop interno em um método diferente.
Não quero executar novamente os loops. Ao quebrar, terminei com a execução do bloco de loop.
java
loops
nested-loops
boutta
fonte
fonte
break
. Mesmo assim, as exceções são outra exceção mais conhecida (desculpe). Mas eu ainda ficaria descontente com isso se não fosse óbvio (pequenos loops, comentário de aviso se o rótulo / quebra ainda não estiver visível o suficiente).outerloop
é um rótulo. Não sei exatamente qual código você tentou, mas o código na minha resposta compila e roda muito bem.Tecnicamente, a resposta correta é rotular o loop externo. Na prática, se você quiser sair a qualquer momento dentro de um loop interno, seria melhor externalizar o código em um método (um método estático, se necessário) e depois chamá-lo.
Isso compensaria pela legibilidade.
O código se tornaria algo assim:
Correspondendo ao exemplo da resposta aceita:
fonte
loop
método e retorne do método para continuar.Você pode usar um bloco nomeado ao redor dos loops:
fonte
name: if(...){...}
faz condição nomeada? :)for
direta. Você pode adicionar um código antes do último}
que será executado apenas se a condição nunca for atendida.Eu nunca uso etiquetas. Parece uma prática ruim entrar. Aqui está o que eu faria:
fonte
&& !finished
vez de|| !finished
? E por que usarbreak
e não usar também&& !finished
para o loop interno?break
para poder sair arbitrariamente do loop. Se houver código após esseif
bloco, você podebreak
antes que ele seja executado. Mas você está certo&&
. Corrigido.Você pode usar etiquetas:
fonte
Use uma função:
fonte
Você pode usar uma variável temporária:
Dependendo da sua função, você também pode sair / retornar do loop interno:
fonte
Se você não gosta de
break
s egoto
s, pode usar um loop for "tradicional" em vez do for-in, com uma condição de abortamento extra:fonte
Eu precisava fazer uma coisa semelhante, mas optei por não usar o loop for aprimorado para fazer isso.
fonte
s
para um valor menori
ou mudari
para um valor maior ou igual as
, ambos devem fazer o truque. Você está certo em mudars
, porque pode ser usado em outro lugar mais tarde, mas a mudançai
não prejudicará, apenas garantirá que a primeirafor
não continue em loop.Eu prefiro adicionar uma "saída" explícita aos testes de loop. Isso deixa claro para qualquer leitor casual que o loop pode terminar mais cedo.
fonte
Stream
Solução Java 8 :fonte
Normalmente, nesses casos, ele está no escopo de uma lógica mais significativa, digamos, alguma pesquisa ou manipulação sobre alguns dos objetos iterados 'for' em questão, então geralmente uso a abordagem funcional:
Principais contras:
Os prós:
Portanto, é apenas lidar com o caso através de uma abordagem diferente.
Basicamente, uma pergunta ao autor desta pergunta: o que você considera dessa abordagem?
fonte
Você pode interromper todos os loops sem usar nenhum rótulo: e sinalizadores.
É apenas uma solução complicada.
Aqui a condição1 é a condição usada para interromper o loop K e J. E a condição2 é a condição usada para interromper o loop K, J e I.
Por exemplo:
fonte
(int k = 0; k < 10; k++)
e você não corrigir todas ask = 9
parak = 10
. Você pode entrar em um loop infinito.O conceito de interrupção rotulada é usado para interromper loops aninhados em java, usando break rotulado você pode interromper o aninhamento de loops em qualquer posição. Exemplo 1:
suponha que existam 3 loops e você queira finalizar o loop3: Exemplo 2:
fonte
fonte
Se estiver dentro de alguma função, por que você não a devolve:
fonte
Melhor e fácil método ..
fonte
Abordagem bastante incomum, mas em termos de tamanho do código ( não desempenho ), essa é a coisa mais fácil que você pode fazer:
fonte
Use etiquetas.
Consulte este artigo
fonte
Outra solução, mencionada sem exemplo (na verdade, funciona no código prod).
Obviamente,
BreakLoopException
deve ser interno, privado e acelerado com rastreamento sem pilha:fonte
for (int j = 0; j < 5; j++) //inner loop
deve ser substituído porfor (int j = 0; j < 5 && !exitloops; j++)
.Aqui, nesse caso, loops aninhados completos devem sair se a condição for
True
. Mas se usarmosexitloops
apenas para o superiorloop
O loop interno continuará, porque não há sinalizador extra que notifique esse loop interno para sair.
Portanto, ele deve usar
exitloops
também os loops internos.fonte
Como na sugestão de INFORMAÇÃO @ 1800, use a condição que quebra o loop interno como uma condição no loop externo:
fonte
Se for uma nova implementação, você pode tentar reescrever a lógica como instruções if-else_if-else.
Caso contrário, você pode tentar definir um sinalizador quando essa condição especial ocorrer e verificar esse sinalizador em cada uma de suas condições de loop.
AQUI! Portanto, embora uma simples pausa não funcione, ela pode ser feita para funcionar usando
continue
.Se você está simplesmente portando a lógica de uma linguagem de programação para Java e apenas quer que a coisa funcione, tente usar rótulos .
fonte
Demo for
break
,continue
elabel
:Palavras-chave Java
break
econtinue
têm um valor padrão. É o "loop mais próximo", e hoje, depois de alguns anos usando Java, acabei de conseguir!Parece usado raro, mas útil.
fonte
Demo
fonte
Você pode fazer o seguinte:
defina uma variável local como
false
defina essa variável
true
no primeiro loop, quando quiser quebrarentão você pode verificar no loop externo, se a condição está definida, também se romperá com o loop externo.
fonte
Para alguns casos, podemos usar o
while
loop efetivamente aqui.fonte
O Java não possui um recurso goto, como no C ++. Mas ainda assim,
goto
é uma palavra-chave reservada em Java. Eles podem implementá-lo no futuro. Para sua pergunta, a resposta é que existe algo chamado rótulo em Java ao qual você pode aplicar uma declaraçãocontinue
ebreak
. Encontre o código abaixo:fonte
Até criar um sinalizador para o loop externo e verificar se após cada execução do loop interno pode ser a resposta.
Como isso:
fonte
Use
condition
como um sinalizador para quando terminar o processamento. Então, o loop interno continua apenas enquanto a condição não for atendida. De qualquer forma, o loop externo continuará funcionando.fonte