CodeGym /Blogue Java /Random-PT /Algo sobre matrizes
John Squirrels
Nível 41
San Francisco

Algo sobre matrizes

Publicado no grupo Random-PT
Oi! Anteriormente em seu treinamento, trabalhamos com objetos únicos (e tipos primitivos). Mas e se precisarmos trabalhar com todo um grupo de objetos em vez de apenas um? Por exemplo, digamos que queremos criar uma lista de aniversários de todos os funcionários da nossa empresa. Ele deve conter 30 strings formatadas da seguinte forma: "Sarah Huffman, 25 de janeiro" Vamos nos beneficiar de uma estrutura de dados especial chamada array . Se compararmos um array com um objeto real, ele é muito semelhante a um cofre de banco com cofres: Algo sobre matrizes - 1Um array também consiste em "caixas". Você pode colocar algo (um elemento) em cada caixa. Para acessar um elemento, você precisa saber seu número de caixa (índice). É assim que um array é criado:

public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10];
      
   }
}
Aqui criamos uma matriz que contém 10 elementos. Você pode observar imediatamente alguns recursos da matriz:
  1. Ele armazena elementos de um tipo de dados bem definido . Se criarmos um array String, não podemos armazenar mais nada nele. O tipo de dados é especificado quando a matriz é criada . É aqui que difere de um cofre (no qual o cliente pode guardar o que quiser).

  2. Seu tamanho deve ser especificado quando o array é criado . Você não pode indicá-lo posteriormente ou alterar seu tamanho após a criação do array .
O fato de estarmos criando um array é indicado pelos colchetes em ambos os lados da expressão. Eles podem ser especificados antes ou depois do nome da variável de referência. De qualquer maneira vai funcionar:

String [] birthdays = new String[10];
String birthdays [] = new String[10];
Se você quiser escrever algo em um array, você precisa especificar o índice da caixa onde o valor será escrito. As caixas em uma matriz são numeradas a partir de 0. Contar a partir de zero é uma prática muito comum em programação. Quanto mais rápido você se acostumar, melhor :) Algo sobre matrizes - 2 Isso significa que, se você quiser colocar algum valor na primeira caixa , faça o seguinte:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
   }
}
Agora o aniversário de Jana está armazenado na primeira célula de nosso array de aniversários de funcionários: Você pode adicionar outros valores de maneira semelhante:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";
   }
}
Observe que adicionamos o aniversário de Rosie à oitava caixa (você não esqueceu por que a caixa nº 7 é a oitava caixa, não é?) . Você pode ver que não preenchemos todas as outras células. Não precisamos escrever valores em uma matriz em ordem. Não há tal exigência. Claro, escrever elementos em ordem torna muito mais fácil controlar quantas caixas estão livres e quantas estão ocupadas, e evita que o array tenha "buracos". Se você deseja obter o conteúdo de uma das caixas, então (assim como em um cofre) você precisa saber seu número. Assim que se faz:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       String rosieBirthday = birthdays[7];
       System.out.println(rosieBirthday);
   }
}
Saída do console: Rosie Mills, 3 de janeiro Criamos uma Stringvariável e dissemos ao compilador: "Encontre a caixa com índice 7 na matriz de aniversários e atribua o valor contido lá à Stringvariável rosieBirthday ". E foi exatamente isso que aconteceu. Ao trabalhar com arrays, podemos encontrar facilmente seu comprimento usando uma propriedade especial: length .

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       int birthdaysLength = birthdays.length;
       System.out.println(birthdaysLength);
   }
}
Saída do console: 10 Nota: A lengthpropriedade armazena o tamanho da matriz, não o número de caixas que estão cheias. Nosso array armazena apenas 3 valores, mas indicamos seu tamanho como 10 quando o criamos. E este é exatamente o valor que o lengthcampo retorna. Por que isso seria útil? Bem, suponha que você queira exibir uma lista de todos os aniversários (para verificar se ninguém foi esquecido). Você pode fazer isso em um loop simples:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[2] = "Jeremiah Leonard, July 12";
       birthdays [3] = "Kenny Russo, September 7";
       birthdays[4] = "Tommie Barnes, November 9";
       birthdays [5] = "Roman Baranov, August 14";
       birthdays [6] = "Chanice Andersen, April 1";
       birthdays[7] = "Rosie Mills, January 3";
       birthdays [8] = "Keenan West, October 19";
       birthdays [9] = "Abraham McArthur, May 3";

       for (int i = 0; i < birthdays.length; i++) {
           System.out.println(birthdays[i]);
       }
   }
}
No loop, declaramos a variável i, que é inicializada com zero. A cada passagem, obtemos o elemento com índice i de nosso array e exibimos seu valor. O loop fará 10 iterações e i aumentará de 0 a 9 - e os números são os índices dos elementos de nossa matriz! Como resultado, exibiremos todos os valores de aniversários[0] a aniversários[9] Na verdade, há outra maneira de criar uma matriz. Por exemplo, você pode criar um array de ints assim:

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
   }
}
Essa técnica é chamada de "inicialização de atalho". É bastante conveniente, porque simultaneamente criamos um array e o preenchemos com valores. Não precisamos especificar explicitamente o tamanho do array: com inicialização de atalho, o lengthcampo é definido automaticamente.

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
       System.out.println(numbers.length);
   }
}
Saída do console: 9 Agora, um pouco sobre como os arrays são armazenados na memória. Digamos que temos um array de três Catobjetos:

public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Behemoth");
       cats[2] = new Cat("Lionel Messi");
   }
}
Você precisa entender algumas coisas aqui:
  1. No caso de primitivos, um array armazena um conjunto de valores específicos (por exemplo, ints). No caso de objetos, um array armazena um conjunto de referências .
    A catsmatriz consiste em três elementos, cada um dos quais é uma referência a um Catobjeto. Cada uma das referências aponta para o endereço de memória onde o objeto correspondente está armazenado.

  2. Os elementos da matriz são organizados em um único bloco na memória. Isso é feito para permitir que eles sejam acessados ​​de forma rápida e eficiente.
Assim, catsreferencia o bloco de memória onde estão armazenados todos os objetos (elementos do array). Cats[0]faz referência a um endereço específico dentro deste bloco. Algo sobre matrizes - 3 É importante entender que um array não armazena apenas objetos: ele é um objeto em si. Isso nos leva a questionar se podemos criar não apenas array de strings ou números, mas também arrays de arrays . E a resposta é sim, podemos! Uma matriz pode armazenar quaisquer objetos, incluindo outras matrizes. Tal array é chamado de bidimensional . Se fôssemos representá-la visualmente, seria muito semelhante a uma mesa comum. Suponha que queremos criar um array de 3 arrays que podem armazenar 10 ints cada um. Ficaria assim:
Algo sobre arrays - 4
Cada linha representa uma intmatriz. A primeira matriz contém números de 1 a 10, a segunda matriz — de -1 a -10 e a terceira — um conjunto de números aleatórios. Cada uma dessas matrizes é armazenada nas caixas de nossa matriz bidimensional. No código, a inicialização de um array bidimensional se parece com isto:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
}
Nossos gatos de array bidimensionais armazenam 3 arrays com 5 caixas em cada array. Se quisermos colocar um objeto na terceira caixa do segundo array, faríamos assim:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
   cats[1][2] = new Cat("Fluffy");
}
[1]indica a segunda matriz e [2]indica a terceira caixa dessa matriz. Como uma matriz bidimensional consiste em várias matrizes, para iterar por ela e exibir todos os seus valores (ou preencher todos os seus elementos), precisamos de um loop aninhado:

for (int i = 0; i < cats.length; i++) {
   for (int j = 0; j < cats[i].length; j++) {
       System.out.println(cats[i][j]);
   }
}
No loop externo (variável i), iteramos sobre todos os arrays em nosso array bidimensional. No loop interno (variável j), passamos por todos os elementos de cada array. Como resultado, Cats[0][0] (primeiro array, primeiro elemento) será exibido primeiro, seguido por cats[0][1] (primeiro array, segundo elemento). Depois de passarmos pela primeira matriz, exibiremos os gatos[1][0] , gatos[1][1] , gatos[1][2] , etc. A propósito, as matrizes bidimensionais também suportam inicialização abreviada:

int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
Normalmente, declararíamos o array bidimensional numberscomo um int[3][3], mas essa abreviação nos permite especificar os valores imediatamente. Por que você precisaria de um array bidimensional? Bem, você pode usar um para recriar facilmente o famoso jogo "Battleship": Algo sobre matrizes - 5 Em "Battleship", a estrutura do campo de jogo pode ser descrita facilmente: uma matriz bidimensional de 10 matrizes com 10 elementos cada. Você cria duas dessas matrizes (uma para você e outra para seu oponente)

int[][] battleshipBoard1 = new int[10][10];
int[][] battleshipBoard2 = new int[10][10];
use alguns valores (por exemplo, números ou símbolos) para preencher os elementos correspondentes à localização de seus navios e, em seguida, alterne para chamar as coordenadas de elementos específicos:
  • encouraçadoTabuleiro1[0][2]!
  • Perder! encouraçadoTabuleiro2[2][4]!
  • Bater!
  • encouraçadoTabuleiro2[2][5]!
  • Bater!
  • encouraçadoBoard2[2][6]!,
  • Afundado!
Isso conclui nossa primeira introdução aos arrays, mas é apenas o começo de nossa interação com eles. Nas lições a seguir, veremos maneiras interessantes de usá-los e também aprenderemos quais funções integradas do Java para nos permitir trabalhar com essa estrutura de dados de maneira mais conveniente :)
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION