Oi, habrozhiteli! Este livro é destinado a iniciantes.
Por muitos anos, a linguagem Java tem sido uma das mais populares e procuradas. É bonito, eficaz e, mais importante, muito produtivo. Mas, infelizmente, não é o mais fácil. É por isso que a demanda por programadores Java é consistentemente alta. A linguagem Java é um diamante que adornará a bagagem de conhecimento de qualquer programador. E aprender Java, como espero, os leitores deste livro terão que ter certeza de que não é apenas útil, mas também interessante. A base do livro são cursos de palestras, em momentos diferentes, que li para os mestres da Faculdade de Física da Universidade Nacional de Kiev, em homenagem a Tarasa Shevchenko, solteirona da faculdade de engenharia médica da Universidade Técnica Nacional da Ucrânia, “Instituto Politécnico de Kiev” e estudantes de vários cursos de programação. O material do livro e a forma de apresentação são adaptados para todos que desejam aprender Java não apenas em instituições educacionais, mas também de forma independente. Portanto, o livro pode ser usado como um tutorial.
Matrizes
Uma matriz significa um conjunto do mesmo tipo de valores (variáveis), que pode ser acessado por um nome comum. Este capítulo é dedicado a matrizes.
Variáveis pertencentes a uma matriz são chamadas de elementos dessa matriz. Para identificar exclusivamente um elemento de uma matriz, você precisa saber o nome da matriz e a posição (posicionamento) do elemento na matriz. A posição dos elementos na matriz é determinada usando índices inteiros. O número de índices necessários para identificar um elemento de uma matriz é chamado de dimensão da matriz. Uma matriz unidimensional é uma matriz na qual os elementos são identificados usando um único índice.
Matrizes unidimensionais
É conveniente imaginar uma matriz unidimensional na forma de uma cadeia ordenada ou sequência de variáveis (do mesmo tipo). Para declarar uma matriz unidimensional, você deve especificar o tipo ao qual os elementos da matriz pertencem, o nome da matriz e também o número de elementos incluídos na matriz. A sintaxe para declarar uma matriz unidimensional é:
[] =new [];
Primeiro, o tipo dos elementos da matriz é indicado e após o identificador do tipo ser seguido por colchetes vazios. Em seguida, o nome da matriz, o operador de atribuição, a instrução (operador) new, novamente o tipo dos elementos da matriz e entre colchetes o tamanho da matriz (o número de elementos na matriz). Por exemplo, o comando int nums = new int [20] declara uma matriz nums inteira de 20 elementos.
Estritamente falando, o comando de declaração de matriz apresentado aqui é uma simbiose de dois comandos: o comando int [] nums que declara uma variável nums do tipo "matriz inteira" (variável de matriz) e a nova instrução int [20], que de fato cria a matriz. Essa instrução recebe o valor da variável nums e, como resultado da referência da matriz, ela é gravada na variável nums. Em outras palavras, o processo de criação de uma matriz pode ser realizado com dois comandos:
int[] nums; nums=new int[20];
Além disso, esses comandos podem ser publicados no código do programa - ou seja, podemos declarar uma variável da matriz e somente então, em outro local do código, criar uma matriz (e escrever um link para essa matriz na variável da matriz).
DETALHES Anteriormente, lidávamos principalmente com tipos básicos ou primitivos (como int, char ou double). Uma variável do tipo base armazena o valor. Tecnicamente, é assim: um espaço é alocado para uma variável na memória e o valor da variável é gravado nesse local. Mas há outra maneira de trabalhar com dados em que uma variável se refere a dados. É o que acontece aos objetos e, portanto, as matrizes são implementadas. Na verdade, existe um array, mas não temos acesso direto a ele, mas com a ajuda de um intermediário, que é uma variável do array. O valor da variável da matriz não é a matriz, mas o endereço da matriz. Portanto, criar uma variável de matriz não significa criar uma matriz. Uma matriz é criada separadamente. Vamos descrever essa situação como aquela em que uma variável de matriz se refere a uma matriz. Cada vez que precisamos acessar a matriz, acessaremos a variável da matriz que se refere à matriz especificada.
Embora, à primeira vista, esse esquema possa parecer redundante, no entanto, tem suas vantagens. E vamos ver isso.
Nos casos em que não há mal-entendidos, identificaremos a variável da matriz com a matriz.
Ao declarar uma variável da matriz, é permitido indicar colchetes após o identificador do tipo ou após o nome da matriz. Por exemplo, em vez do comando int [] nums, você pode usar o comando int nums [].
Um elemento de uma matriz unidimensional é acessado através do nome da matriz com o índice do elemento indicado entre colchetes. Os elementos da matriz de indexação começam do zero. Assim, a referência ao primeiro elemento da matriz nums se parecerá com nums [0]. Se houver 20 elementos na matriz, o último elemento da matriz terá um índice 19, ou seja, a instrução para acessar o elemento será semelhante a nums [19].
O comprimento da matriz pode ser encontrado usando a propriedade length: o nome da matriz é indicado e, através do ponto, a propriedade length. Por exemplo, para descobrir o comprimento da matriz nums, você pode usar a instrução nums.length. Em seguida, a referência ao último elemento da matriz pode ser escrita como nums [nums.length-1].
AVISO O Java usa uma verificação automática para verificar se sai da matriz. Portanto, se o código se referir a um elemento de matriz inexistente, ocorrerá um erro.
Ao declarar uma matriz, a memória é alocada para ela. Em Java, os elementos da matriz são inicializados automaticamente com valores zero - as células selecionadas são zeradas e os valores dessas células zeradas são interpretadas dependendo do tipo de matriz. Mas você não deve confiar nessa inicialização automática. É aconselhável inicializar os elementos da matriz explicitamente. Para fazer isso, use o operador loop ou especifique uma lista de valores de elementos ao declarar uma matriz.
Para inicializar a matriz com uma lista de valores ao declarar uma variável da matriz, após ser indicada (por meio do operador de atribuição) uma lista de valores entre chaves. Por exemplo:
int[] data={3,8,1,7};
Aqui, os dados da variável são declarados para uma matriz inteira, uma matriz é criada e um link para ela é gravado nessa variável. O tamanho da matriz e os valores dos elementos são determinados automaticamente de acordo com o número de elementos na lista de valores. Nesse caso, uma matriz inteira de quatro elementos é criada com os valores dos elementos 3, 8, 1 e 7. O mesmo resultado pode ser alcançado usando, por exemplo, os seguintes comandos:
int[] data; data=new int[]{3,8,1,7};
O primeiro comando int [] data declara uma variável de matriz. A instrução new int [] {3,8,1,7} cria uma matriz de quatro números inteiros, e uma referência a essa matriz é atribuída aos dados variáveis (ou seja, o comando data = new int [] {3,8,1,7}) .
Um exemplo de declaração, inicialização e uso de matrizes é mostrado na Listagem 3.1.
Listagem 3.1. Apresentando matrizes unidimensionais
class Demo{ public static void main(String[] args){
O programa declara e inicializa uma matriz de dados de quatro elementos. O comprimento da matriz é calculado pela instrução data.length. Este valor é gravado na variável inteira n (comando n = data.length). Em seguida, o comando int [] nums = new int [n] declara outra matriz de números inteiros. O número de elementos nessa matriz é determinado pelo valor da variável n, portanto, coincide com o tamanho da matriz de dados. O preenchimento da matriz nums é feito usando uma instrução loop. Os valores dos elementos da matriz nums são calculados com base nos valores dos elementos da matriz de dados (comando nums [i] = 2 * dados [i] -3). Para exibir os valores dos elementos da matriz nums, use o comando System.out.println ("nums [" + i + "] =" + nums [i]).
A seguir, é exibido o resultado da execução do programa:
O resultado do programa (da Listagem 3.1)
nums[0]=3 nums[1]=13 nums[2]=-1 nums[3]=11
Mais uma vez, observamos que a indexação dos elementos da matriz começa do zero. Portanto, no operador de loop, a variável de índice i é inicializada com o valor inicial zero, e o operador de desigualdade estrita é usado na condição de teste i <nums.length.
Também é importante que, ao criar a matriz nums, seu tamanho seja determinado usando a variável n, cujo valor é calculado durante a execução do programa.
Matrizes bidimensionais e multidimensionais
A dimensão da matriz pode ser maior que uma. Mas, na prática, matrizes de dimensão maior que a segunda raramente são usadas. A seguir, veremos maneiras de declarar, inicializar e usar matrizes bidimensionais nas quais o acesso a um elemento de uma matriz é realizado usando dois índices. Se você representar uma matriz bidimensional como uma tabela, o primeiro índice do elemento determinará a linha na qual o elemento está localizado e o segundo índice determinará a coluna na qual o elemento está localizado.
DETALHES Embora uma matriz bidimensional seja convenientemente representada como uma tabela, ela é implementada de uma maneira completamente diferente. De fato, uma matriz bidimensional em Java é uma matriz unidimensional cujos elementos são variáveis de matriz. Cada variável refere-se a uma matriz unidimensional. Ao usar essa construção, surge a ilusão de que estamos lidando com uma tabela.
Criar matrizes bidimensionais é tão simples quanto criar matrizes unidimensionais. Mas, ao declarar uma variável para uma matriz bidimensional, dois pares de colchetes vazios são indicados após o identificador de tipo, e as instruções para criar uma matriz bidimensional - entre colchetes separados - indicam o tamanho de cada um dos índices (o número de linhas e colunas na matriz). A sintaxe para declarar uma matriz bidimensional é a seguinte:
[][] =new [][];
Como no caso de uma matriz unidimensional, este comando pode ser dividido em duas:
[][] ; =new [][];
O primeiro comando declara uma variável para uma matriz bidimensional. O segundo comando cria uma matriz bidimensional real com os tamanhos especificados e uma referência a essa matriz é atribuída como o valor da variável da matriz. Por exemplo, o comando double [] [] data = new double [3] [4] cria uma matriz bidimensional com elementos do tipo double. A matriz possui 3 linhas e 4 colunas e o link para a matriz é gravado na variável de dados. Os mesmos comandos resultarão no mesmo resultado:
double[][] data; data=new double[3][4];
O acesso aos elementos de uma matriz bidimensional é realizado no seguinte formato: o nome da matriz é indicado, entre colchetes é o primeiro índice do elemento, em outros colchetes é o segundo índice do elemento da matriz. A indexação em todas as dimensões começa do zero. Por exemplo, o link de dados [0] [3] é uma chamada para um elemento da matriz de dados com os índices 0 e 3, e é um elemento na primeira linha e na quarta coluna.
Para inicializar uma matriz bidimensional, são utilizados operadores de loop aninhados ou uma lista composta por listas de valores. Cada lista interna define os valores dos elementos da matriz em uma sequência. A seguir, exemplos de inicialização de uma matriz bidimensional usando uma lista:
double[][] data={{0.1,0.2,0.3},{0.4,0.5,0.6}}; int nums[][]={{1,2,3},{4,5}};
O primeiro comando cria e inicializa uma matriz de dados bidimensional 2 por 3 (duas linhas e três colunas). O número de linhas é determinado pelo número de elementos na lista externa. Existem dois desses elementos - estas são as listas {0.1,0.2,0.3} e {0.4,0.5,0.6}. Cada uma dessas listas possui três elementos. A partir daqui, obtemos uma matriz de tamanho 2 por 3. A lista {0.1,0.2,0.3} define os valores dos elementos na primeira linha, a lista {0.4,0.5,0.6} define os valores dos elementos na segunda linha. Por exemplo, o elemento data [0] [0] obtém o valor 0,1, o elemento data [0] [2] obtém o valor 0,3, o elemento data [1] [0] obtém o valor 0,4 e o elemento data [1] [0] obtém o valor 0,6 .
O segundo comando cria uma matriz nums inteira, que consiste em duas linhas (uma vez que existem dois elementos dentro da lista atribuída - listas {1,2,3} e {4,5}). No entanto, a primeira linha da matriz criada contém três elementos (já que existem três valores na lista {1,2,3}) e a segunda linha da matriz contém dois elementos (já que existem dois valores na lista {4,5}). Na matriz criada, o elemento nums [0] [0] possui o valor 1, o elemento nums [0] [1] possui o valor 2, o elemento nums [0] [2] possui o valor 3, o elemento nums [0] [0] possui o valor 3, o elemento nums [0] [0] possui o valor 4 e o elemento nums [1] [1] é o valor 5.
DETALHES O problema é que a matriz nums em linhas diferentes contém um número diferente de elementos, não. Tecnicamente, tudo é implementado mais do que simplesmente. A variável dos números numéricos da matriz bidimensional na verdade se refere a uma matriz unidimensional de dois elementos (o número de linhas na matriz bidimensional). Mas os elementos dessa matriz não são números inteiros, mas variáveis que podem se referir a matrizes inteiras unidimensionais (relativamente falando, os elementos são do tipo int []). A primeira variável refere-se a uma matriz unidimensional de três elementos (1, 2 e 3) e a segunda variável refere-se a uma matriz unidimensional de três elementos (4 e 5). Quando indexamos (com um índice!) A variável nums, obtemos acesso ao elemento da matriz unidimensional referenciada por essa variável. Por exemplo, nums [0] é o primeiro elemento e nums [1] é o segundo elemento da matriz mencionada a partir de variáveis da matriz. E esses elementos são referências a matrizes. Eles podem ser indexados. Portanto, digamos que nums [0] [1] é o segundo elemento na matriz ao qual o primeiro elemento nums [0] se refere na matriz à qual a variável nums se refere. Então, tudo realmente acontece. E interpretamos a instrução nums [0] [1] como um apelo a um elemento na primeira linha e na segunda coluna de uma matriz bidimensional.
A Listagem 3.2 mostra um exemplo de programa que cria uma matriz bidimensional que é preenchida usando instruções de loop aninhadas.
Listagem 3.2. Crie uma matriz bidimensional
class Demo{ public static void main(String[] args){ int i,j,n=3,val=1;
O comando int [] [] nums = new int [n-1] [n] cria uma matriz nums inteira com n-1 linhas e n colunas. A variável n é pré-atribuída ao valor 3. A matriz é preenchida usando operadores de loop aninhados. O valor para o elemento da matriz (para determinados índices iej) é atribuído pelo comando nums [i] [j] = val ++. Aqui, o elemento nums [i] [j] recebe o valor atual da variável val e imediatamente depois disso o valor da variável val é aumentado em um.
AVISO Como resultado da execução da instrução val ++, o valor da variável val é aumentado em um. Mas como a forma postfix do operador de incremento é usada, o valor da expressão val ++ é o valor antigo (antes de aumentar em um) da variável val.
Depois de calcular o valor do elemento, ele é exibido na área de saída. Como resultado do programa, obtemos:
O resultado do programa (da lista 3.2)
1 2 3 4 5 6
A Listagem 3.3 mostra o código para um programa que cria uma matriz bidimensional com cadeias de diferentes comprimentos.
Listagem 3.3. Matriz com strings de diferentes comprimentos
class Demo{ public static void main(String[] args){ int i,j,val=1;
O comando int [] [] nums = new int [4] [] cria uma matriz nums inteira bidimensional. Essa matriz consiste em quatro linhas. No entanto, o tamanho das linhas não é especificado - o segundo par de colchetes no final do comando está vazio. Mais precisamente, ainda não há linhas. Eles precisam ser criados. Linhas são criadas na instrução de loop. Nesta instrução de loop, a variável de índice i executa valores de 0 a nums.length-1, inclusive. O comando nums [i] = new int [i + 1] cria uma linha de uma matriz bidimensional com o índice i. Essa string contém o elemento i + 1.
DETALHES Tecnicamente, tudo acontece assim: a nova instrução int [i + 1] cria uma matriz unidimensional (uma sequência para uma matriz bidimensional) e uma referência a essa matriz é gravada na variável nums [i]. Nesse caso, nums [i] pode ser interpretado como um link para uma linha com o índice i. O significado da instrução nums.length ficará claro se você lembrar que, de fato, uma matriz bidimensional é uma matriz unidimensional, cujos elementos se referem a matrizes unidimensionais. Nesse caso, nums.length fornece um valor para o número de elementos na matriz referenciada pela variável nums - ou seja, esse é o número de linhas na matriz bidimensional.
Como resultado, obtemos uma matriz bidimensional de um tipo triangular: na primeira linha da matriz, há um elemento, na segunda - dois elementos e assim por diante, até a quarta linha da matriz.
A matriz criada é preenchida usando operadores de loop aninhados. A variável de índice i no operador de loop externo leva valores de 0 a nums.length-1 e define uma linha na matriz nums bidimensional. Para a variável de índice j, o limite superior do intervalo de variação é determinado pela instrução nums [i] .length, que retorna o número de elementos na linha com o índice i (a variável j muda de 0 para nums [i] .length-1 inclusive).
DETALHES Note-se que nums [i], de fato, é uma variável que se refere a uma matriz unidimensional que forma uma string com o índice i. O número de elementos nessa matriz (string) é determinado pela expressão nums [i] .length.
O valor dos elementos da matriz é atribuído pelo comando nums [i] [j] = val ++. A seguir, é exibido o resultado da execução do programa:
O resultado do programa (da lista 3.3)
1 2 3 4 5 6 7 8 9 10
Como esperado, obtivemos uma matriz que possui diferentes números de elementos em diferentes linhas.
AVISO Matrizes, cuja dimensão é mais de duas, são criadas da mesma maneira. Ao declarar uma variável para uma matriz multidimensional, pares de colchetes vazios são indicados após o identificador de tipo. O número de tais pares é determinado pela dimensão da matriz. No comando de criação da matriz, o tamanho de cada índice é indicado entre colchetes.
»Mais informações sobre o livro podem ser encontradas no site do editor
» Conteúdo
» Trecho
Cupom de 25% de desconto para vendedores ambulantes - Java
Após o pagamento da versão impressa do livro, um livro eletrônico é enviado por e-mail.