Doubt about displaying inverted array

2

Could you explain how it works to return an array with inverted values? I took this exercise to do but I could not. So a colleague gave me this exercise so I could dissect him, but I did not understand anything: S.

package pct;
import java.util.Scanner;
public class Exer5 {
    public static void main(String[] args) {
        Scanner teclado = new Scanner (System.in);
        int[] vetor1 = new int[5];
        int tamanho =  vetor1.length;
        int[] vetor2 = new int[tamanho];

        for (int i = 0; i < 5; i++) {
            System.out.println("Digite um número:");
            vetor1[i] =  teclado.nextInt();

        }
        for (int i = 0; i < vetor1.length; i++) {
            tamanho--;
            vetor2[i] = vetor1[tamanho];
        }

        System.out.println("Os valores invertidos, foram:" +vetor2);
    }
}

My biggest doubts are in the second for , I practically did not understand anything that happened there.

    
asked by anonymous 16.08.2017 / 04:11

2 answers

1

Explaining the code:

// Nome do pacote.
package pct;

// Essa classe serve para ler dados a partir de uma entrada.
import java.util.Scanner;

// Todo o código está dentro de uma classe.
public class Exer5 {

    // Dentro do método main, que é o método principal da aplicação (e o único neste caso).
    public static void main(String[] args) {

        // Cria um Scanner que lê entradas da entrada padrão (System.in).
        // "teclado" não é a melhor definição disso, mas de qualquer forma,
        // trata-se de um objeto que vai fornecer o que o usuário digitar.
        Scanner teclado = new Scanner (System.in);

        // Cria um array com 5 posições.
        int[] vetor1 = new int[5];

        // Seria mais fácil fazer assim: int tamanho = 5;
        int tamanho =  vetor1.length;

        // Outro array com 5 posições.
        int[] vetor2 = new int[tamanho];

        // Executa 5 vezes, contando (com i): 0, 1, 2, 3 e 4.
        for (int i = 0; i < 5; i++) {
            // Pede para o usuário digitar algo.
            System.out.println("Digite um número:");

            // Lê o que ele digitou e põe no array.
            vetor1[i] =  teclado.nextInt();

        }

        // Neste ponto o array1 vai estar preenchido com os 5 valores digitados.

        // Executa 5 vezes, contando (com i): 0, 1, 2, 3 e 4.
        for (int i = 0; i < vetor1.length; i++) {

            // A variável tamanho começa com 5.
            // Quando i for 0, tamanho será 4.
            // Quando i for 1, tamanho será 3.
            // ...
            // Quando i for 4, tamanho será 0.
            // Observe que tamanho sempre será a "posição reversa" no array.
            tamanho--;

            // Coloca o elemento de um array na posição reversa do outro.
            vetor2[i] = vetor1[tamanho];
        }

        // Deveria mostrar os valores invertidos. Mas vai dar errado!
        System.out.println("Os valores invertidos, foram:" +vetor2);
    }
}

The output at the end will look something like this:

Os valores invertidos, foram:[I@1540e19d

Let's improve this program:

package pct;

import java.util.Arrays;
import java.util.Scanner;

public class Exercicio5 {

    public static void main(String[] args) {
        int tamanhoVetor = 5;
        Scanner scan = new Scanner(System.in);
        int[] original = new int[tamanhoVetor];
        int[] inverso = new int[tamanhoVetor];

        for (int i = 0; i < tamanhoVetor; i++) {
            System.out.println("Digite um número:");
            original[i] = scan.nextInt();
        }

        for (int i = 0; i < tamanhoVetor; i++) {
            inverso[i] = original[tamanhoVetor - 1 - i];
        }

        System.out.println("Os valores invertidos foram " + Arrays.toString(inverso));
    }
}

The difference here is that I have renamed some variables and instead of counting the variable tamanho backwards, I use this formula:

inverso[i] = original[tamanhoVetor - 1 - i];

Now, the first and last position of these two vectors are 0 and tamanhoVetor - 1 . Therefore, the tamanhoVetor - 1 - i position will be the last position when i is 0 , the penultimate when i is 1 , the antepenultimate when i is 2 , etc.

Arrays do not have method toString() overwritten, and therefore in System.out.println , the result is unintelligible and meaningless text. Using Arrays.toString(inverso) , this problem is healed.

Finally, I set the size to only one place so I do not have tamanho and 5 scattered in multiple places incoherently. Also, the size variable (which I called tamanhoVetor not to confuse with the existing one) never changes so things do not get so confusing.

See here working on ideone (pay attention to the stdin field there in ideone and compare to output).

    
16.08.2017 / 04:32
1

In the second loop of repetition has a variable named tamanho in which it receives the size of vetor1 . This way:

int tamanho =  vetor1.length;

This means that now tamanho = 5 because vetor1 has 5 positions. Each time you pass for , this size is being decremented with tamanho--; which is equivalent to tamanho = tamanho - 1;

Thus, by assigning vetor1[tamanho] to vetor2[i] , it will be inverting the order of the initial vector, taking the last position and inserting in the first one. Here's what happens in the loop:

vetor2[0] = vetor1[4];
vetor2[1] = vetor1[3];
vetor2[2] = vetor1[2];
vetor2[3] = vetor1[1];
vetor2[4] = vetor1[0];
    
16.08.2017 / 04:30