Foreach... duvida ao imprimir conteudo de array

5 respostas
G

Pq?

public class ForeachTeste {

	public static void main(String[] args) {
		
		int []arr = {1,2,3,4};
		for ( int i : arr )
		{
                 //  System.out.println(i); Aqui imprime 1 0 3 0, pq???
		   arr[i] = 0;
		   
		}
		for ( int i : arr )
		{
		   System.out.println(i); // imprime 0 0 3 0, pq???	
	}
		
}
	
}

5 Respostas

T

O melhor jeito de resolver esta questão é notar que

for (int x : array) {
    System.out.println (x);
}

é equivalente a:

for (int k = 0; k < array.length; ++k) {
    int x = array [k];
    System.out.println (x);
}

No seu caso, o primeiro for é equivalente a:

int []arr = {1,2,3,4};  
         for ( int k = 0; k < arr.length; ++k)
         {  
             int i = arr[k];
             arr[i] = 0;  
         }

Faça um "teste de mesa" e veja porque dá o valor 1 0 3 0.

Faça a mesma coisa para o segundo caso (se não resolver corretamente o primeiro caso, não consegue resolver o segundo).

G

thingol,

O primeiro caso eu entendi… mas não consigo enxergar o segundo…

como ele altera o valor 1 (1 0 3 0) para 0 (0 0 3 0)?

Pra mim ele mostraria tudo… sem modificar o array…

Alguma diferença de ++k???

T

Acho que você tem de imprimir mais coisas, não? Aí você entende melhor.

int []arr = {1,2,3,4};  
         for ( int i : arr )  
         {  
            System.out.println(i); 
            arr[i] = 0;  
            System.out.println ("O valor arr [" + i + "] recebeu 0");
         }

Isto vai imprimir:

1
O valor arr[1] recebeu 0
0 
O valor arr[0] recebeu 0
3
O valor arr[3] recebeu 0
0
O valor arr[0] recebeu 0

Isso quer dizer que o array foi preenchido assim, depois do primeiro “foreach”:

arr[0] = 0
arr[1] = 0
arr[2] não foi mexido, e deve conter 3
arr[3] = 0

Ou seja, será impresso 0 0 3 0.

erdanielli

Cara, esse teu código ficou parecendo jogo de 7 erros. Se vc bobear acaba achando que tá tudo certo. Bom, deixa eu ver se consigo esclarecer o ocorrido:

int[] arr = {1,2,3,4};  
for ( int i : arr )  {  
  // i = arr[0 a 3]

  // no primeiro loop, i = 1. Imprime 1. arr[1], que era 2, passa a valer 0
  // no segundo loop, i = 0 porque vc zerou arr[1] no loop anterior. Imprime 0. arr[0], que era 1, passa a valer 0
  // no terceiro loop, i = 3. Imprime 3. arr[3], que era 4, passa a valer 0
  // no quarto loop, i = 0 porque vc zerou arr[3] no loop anterior. Imprime 0. arr[0], que era 0, continua valendo 0

  System.out.println(i);
  arr[i] = 0;  
}

A explicação do colega já diz tudo. Eu tomei a liberdade de expôr o teste de mesa e tentar deixar esclarecido de vez.

Abraços!

G

PQP!!!

Obrigado pela ajuda… antes de responderem… resolvi pegar uma folha de sulfite novinha para fazer o teste…

E consegui entender…

Obrigado!

Criado 25 de fevereiro de 2009
Ultima resposta 25 de fev. de 2009
Respostas 5
Participantes 3