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: Um 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:
Cada linha representa uma
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:
- 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).
- 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 .
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 :) 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 String
variável e dissemos ao compilador: "Encontre a caixa com índice 7 na matriz de aniversários e atribua o valor contido lá à String
variá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 length
propriedade 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 length
campo 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 int
s 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 length
campo é 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 Cat
objetos:
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:
-
No caso de primitivos, um array armazena um conjunto de valores específicos (por exemplo,
int
s). No caso de objetos, um array armazena um conjunto de referências .
Acats
matriz consiste em três elementos, cada um dos quais é uma referência a umCat
objeto. Cada uma das referências aponta para o endereço de memória onde o objeto correspondente está armazenado. - 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.
cats
referencia 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. É 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 int
s cada um. Ficaria assim:
int
matriz. 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 numbers
como 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": 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!
GO TO FULL VERSION