ESTRUTURA DE DADOS HOMOGÊNEA
A manipulação de dados na área de Informática emprega vários tipos de recursos tecnológicos na efetivação de um armazenamento seguro e de seu processamento ágil. Para que isso aconteça de forma eficiente são utilizados os recursos denominados Estrutura de Dados Homogêneas. Geralmente, estas estruturas também são responsáveis pelo melhor desempenho na programação de computadores que manipulam muitos dados durante seu processamento. Apesar da linguagem Java possuir várias implementações deste recurso, estruturas homogêneas, este tópico do conteúdo só abordará as implementações relacionadas abaixo, que correspondem a três classes específicas desta linguagem:
Em Java todos os vetores são objetos, acessíveis por referência, equivalendo portanto a forma de alocação dinâmica utilizada na linguagem C. Essa alocação da memória também é feita em tempo de execução.
Principais Características
As estruturas de dados homogêneas possibilitam o armazenamento de grupos de valores em uma única variável, que será armazenada na memória do computador. Essas estruturas são chamadas de homogêneas, pois seus valores armazenados (conteúdos) serão sempre de um único tipo, não podendo ser diferentes.
Apesar de sua capacidade de armazenar vários valores de forma independente, esta estrutura só possui um único identificador e garante esta independência por meio de um valor único e sequencial denominado índice ou posição da estrutura.
O primeiro índice ou posição na estrutura possui o valor zero (0), por exemplo:
Um exemplo mais corriqueiro de estrutura de dados homogênea seria uma laranjeira, onde todos os seus frutos são iguais, ou seja, todos são laranjas, mas cada laranja nasce em uma posição diferente. Isso traz uma ideia inicial de estrutura de dados homogênea interessante e importante a ser compreendida. Em Java, um Array, Vector ou ArrayList trabalham com alocação de espaço na memória para cada elemento a ser armazenado, porém cada um destes elementos serão armazenados em posições diferentes da memória, apesar de estarem disponíveis para acesso através de um único identificador.
Array
Basicamente, um Array é uma variável que armazena e manipula um conjunto de dados bem organizados na memória do computador. Essa organização torna a localização de um dado na memória muito rápida e seu acesso mais eficiente. A utilização deste recurso em Java permite o armazenamento de múltiplos itens de mesmo tipo de dado em um bloco da memória, podendo este tipo ser primitivo ou definido por uma classe (objetos).
Cada item em um Array é chamado de elemento, e cada elemento é acessado de maneira indepedente através de sua posição numérica (índice). Como na ilustração acima as posições são numeradas a partir do zero (0). O segundo (2ยบ) elemento, por exemplo, é acessado na posição ou índice um (1).
Declarando um Array
Como na declaração de outras variáveis ou atributos, a declaração não cria realmente o Array, mas informa ao seu compilador que esta variável terá um Array do tipo especificado na declaração, por exemplo:
int[ ] meuArray; // declaração de um Array do tipo primitivo int byte[ ] meuArrayBytes; // declaração de um Array do tipo primitivo byte short[ ] meuArrayShorts; // declaração de um Array do tipo primitivo short long[ ] meuArrayLongs; // declaração de um Array do tipo primitivo long float[ ] meuArrayFloats; // declaração de um Array do tipo primitivo byte double[ ] meuArrayDoubles; // declaração do Array de tipo primitivo double boolean[ ] meuArrayBoolean; // declaração do Array de tipo primitivo bolean char[ ] meuArrayChars; // declaração de um Array do tipo primitivo char String[ ] meuArrayStrings; // declaração de um Array do tipo String (objetos)
Você também pode colocar os colchetes após o nome do Array, ou usar atalhos de sintaxe para criar e inicializar um Array, por exemplo:
int meuArray[ ]; // outra forma de criar Array (menos usada em Java) // Cria Array e inicializa suas posições int[ ] meuArray = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
Exemplo de Array unidimensional:
O programa a seguir cria um array de inteiros, atribui algumas posições a ele, e imprime cada valor à saída padrão.
/** * Síntese * Objetivo: armazenar valores no Array e apresentá-los * Entrada: sem entrada (dados atribuídos pelo programa) * Saída: mostrar os elementos armazenados na memória */ class ArrayDemo { public static void main(String[] args) { int[] meuArray; // declaração de um array de inteiros meuArray = new int[5]; // aloca memória para guardar 5 inteiros meuArray[0] = 100; // inicializa o primeiro elemento meuArray[1] = 200; // inicializa o segundo elemento meuArray[2] = 300; // inicializa o terceiro elemento meuArray[3] = 400; // inicializa o quarto elemento meuArray[4] = 500; // inicializa o quinto elemento // Apresentação dos dados armazenados na memória System.out.println("Elemento na posição 0: " + meuArray[0]); System.out.println("Elemento na posição 1: " + meuArray[1]); System.out.println("Elemento na posição 2: " + meuArray[2]); System.out.println("Elemento na posição 3: " + meuArray[3]); System.out.println("Elemento na posição 4: " + meuArray[4]); } }
A execução do programa anterior apresentaria a saída de dados na console como representado na figura a seguir:
Array Multidimensional
Também se pode declarar um Array de arrays (também conhecido como array multidimensional ou matriz), utilizando dois ou mais conjuntos de colchetes [ ][ ]. Cada elemento, deve consequentemente ser alcançado por um número correspondente de valores de índice.
Na linguagem de programação Java um array multidimensional corresponde simplesmente a existência de um Array onde seus elementos são outros arrays, ou seja, em cada elemento de um Array corretamente definido e homogêneo existirá um novo Array de mesmo tipo.
A figura anterior mostra a representação de um Array multidimensional (com duas dimensões - bidimensional), onde as dimensões são divididas entre linhas e colunas. No exemplo desta figura o conteúdo de cada posição foi preenchido através da definição de suas coordenadas, ou seja, da indicação da linha e coluna específica de cada posição existente neste Array bidimensional (preenchimento com linha (ponto) coluna).
Exemplo de Array multidimensional:
/** * Síntese * Objetivo: manipular um Array multidimensional com nomes * Entrada: sem entrada * Saída: mostrar na console os nomes */ class ArrayMultiDemo { public static void main(String[] args) { String[][] nomes = {{"Mr. ", "Mrs. ", "Ms. "},{"Anderson","Pimenta"}}; // Mostrar dados na console System.out.println(nomes[0][0] + nomes[1][0]); System.out.println(nomes[0][2] + nomes[1][1]); } }
A execução do programa anterior é representada na figura a seguir:
A propriedade length do Array é utilizada para identificar seu tamanho (quantidade de posições). Essa propriedade retorna a quantidade de elementos que o seu Array possui.
System.out.println (meuArray.length);
A instrução anterior imprimirá na console o tamanho do Array declarado com identificador listaDados.
Um exemplo comum de Array multidimensional seria a organização do calendário mensal, onde geralmente se dividem as linhas em 7 (dias na horizontal) e as colunas em semanas (na vertical). Cada dia que se deseja pesquisar neste calendário deverá selecionar uma linha e coluna específica.
Veja a imagem acima como exemplo o dia 15 (selecionado na imagem), corresponderia a linha 3 e coluna 5.
Com intuito de apoiar o aprendizado sobre Orientação a Objeto, sugere-se assistir a videoaula para o aperfeiçoamento no conhecimento deste conteúdo. |
Vector
Uma outra implementação disponível em Java para manipular este tipo de estrutura homogênea é a classe Vector. Os objetos dessa classe têm internamente um arranjo (conjunto) de objetos. A diferença para um Object[ ] é que os objetos em Vector lidam transparentemente com as necessidades de criar mais espaço para ampliar a sua área de armazenamento, enquanto os Array possuem tamanho fixo e pré-determinado, como exemplificado anteriormente.
Quando um objeto Vector é criado, seu conteúdo é inicialmente vazio. Os métodos para modificar o conteúdo de um Vector são vários, sendo os principais relacionados a seguir:
addElement(); // acrescenta elemento no final do Vector insertElementAt() // insere elemento na posição especificada setElementAt() // modifica elemento da posição indicada removeElementAt() // remove elemento da posição indicada removeAllElements() // remove todos os elementos do Vector elementAt() // retorna o elemento (objeto) da posição indicada indexOf() // retorna a posição dado o objeto contains() // indica se dado objeto está ou não presente no Vector
Para utilização da classe Vector é necessária a importação da java.util.Vector em seu programa. As principais características no uso deste recurso de armazenamento e manipulação de dados em Java são:
Exemplo de Vector:
/** * Síntese * Objetivo: armazenar e mostrar elementos da memória no Vector * Entrada: sem entrada * Saída: apresenta valores armazenados na estrutura homogênea */ import java.util.Vector; // importação da classe Vector public class VectorDemo { static Vector vetor = new Vector(); // cria Objeto da classe Vector public static void main(String[] args) { vetor.add(500); // Adiciona o numero 500 na estrutura Vector vetor.add(300); // Adiciona o numero 300 no Vector vetor.add(20); // Adiciona o numero 20 no Vector // Apresenta os valores armazenados no objeto vetor da classe Vector System.out.println("Segundo valor no vetor: "+vetor.get(1)); System.out.println("Terceiro valor no vetor: "+vetor.get(2)); System.out.println("Primeiro valor no vetor: "+vetor.get(0)); } }
A representação da execução do programa anterior na console seria como está na figura a seguir:
ArrayList
O recurso denominado Lista (List em Java) consiste em uma forma de organização através da enumeração de dados que propiciam certas facilidades na manipulação de seus elementos para apresentação (visualização de seus conteúdos). Na área de Informática este conceito se expande para uma estrutura de dados dinâmica, em oposição aos arranjos estáticos como os Arrays.
O uso do Array na programação Java possui a característica de imutabilidade, ou seja, uma vez definidas suas dimensões elas não podem ser modificadas, a menos que seja criado um novo objeto Array e todos os seus elementos sejam copiados para ele (poluição da memória).
A classe Vector e ArrayList, que se estará estudando neste tópico, possuem muitas características em comuns. Um aspectos diferencial importante entre estas estruturas está relacionada a execução de múltiplas tarefas simultâneas, onde a classe Vector está preparada para atender tal necessidade. No entanto, apesar de tal exceção, estas duas estruturas possuem uma performance similar, quando não existirem necessidades de processamento simultâneo.
A interface List possui um processo de iteração especial, denominado ListIterator, que permite o início da iteração em qualquer ponto (posição) da lista. A List seria um recurso para organizar esses itens (elementos) na forma tradicional de processamento de uma lista de dados, muito comum na programação de computadores.
Criação de ArrayList
Para criar um objeto do ArrayList basta instanciar um objeto desta classe, permitindo passar ou não como parâmetro ao seu construtor a quantidade inicial de elementos que a lista deverá possuir, por exemplo:
ArrayList tipoA = new ArrayList(); // sem indicação do tamanho que será padrão ArrayList tipoB = new ArrayList(20); // com indicação de tamanho 20
Observe que o tamanho destes objetos (tipoA e tipoB) podem ser obtidos pelo uso do método size(), onde na circunstância de ambos o retorno será zero (0), pois não foi adicionado nenhum objeto nas listas. Contudo, o objeto tipoB foi construído com capacidade inicial de armazenamento de 20 elementos.
Manipulação do ArrayList
A inclusão de objetos na lista pode acontecer por meio do método add(). Esta inclusão poderá indicar em seu argumento a posição da lista que o novo elemento deve possuir. No caso da posição indicada já possuir um elemento (objeto), o mesmo será deslocado uma posição para frente e o novo objeto será colocado na posição solicitada.
O não fornecimento de uma posição específica permite que a própria lista gerencie esta inclusão, simplificando sua instrução, além da preocupação com o uso correto da lista.
Exemplos
Pessoa pes = new Pessoa("joão", "josé"); // Adiciona em tipoA os dados contidos no objeto pes da classe Pessoa tipoA.add(pes); // Adiciona em tipoA os objetos Pessoa tipoA.add(new Pessoa("maria", "silva"));
Para remover um item da lista basta informar o número que corresponde a posição da lista que se deseja remover, por exemplo:
tipoA.remove(1);
Para obter dados da lista pode-se usar o método get(), por exemplo:
Pessoa pes = (Pessoa) tipoA.get(0); // efetuar a conversão para Pessoa System.out.println( pes.nome ); System.out.println( ((Pessoa) tipoA.get(0)).nome ); // outra forma de mostrar
Ao usar o método add, get ou remove o elemento da lista deve existir, caso contrário irá gerar um erro a ser tratado: java.lang.IndexOutOfBoundsException.
Exemplo do uso de ArrayList
/** * Síntese * Objetivo: mostrar o uso de ArrayList * Entrada: adiciona os valores no ArrayList * Saída: mostrar na console os resultados adicionados no ArrayList */ import java.util.ArrayList; // importação da classe ArrayList public class ArrayListDemo { // cria um ArrayList que conterá inteiros static ArrayList lista = new ArrayList();// cria objeto lista de ArrayList public static void main(String[] args){ // adiciona itens na lista lista.add(34); lista.add(12); lista.add(8); // exibe os valores da lista na console for(int aux = 0; aux < lista.size(); aux++) System.out.println("Elemento na posição ["+aux+"]= "+lista.get(aux)); } }
A execução do programa anterior resultaria na demonstração representada na figura a seguir:
Com intuito de demonstrar que estas estruturas homogêneas podem ser utilizadas em conjunto, não sendo excludentes entre elas, é apresentado um exemplo de programa em Java que usa estas estruturas em um mesmo código (programa).
Exemplo com estas estruturas de dados:
/** * Síntese * Objetivo: guardar números, letras e nomes na memória * Entrada: sem entrada (todos dados atribuídos pelo programa) * Saída: mostra todos os dados guardados na memória em estruturas */ import java.util.ArrayList; import java.util.List; import java.util.Vector; public class EstruturasHomoDemo { public static void main(String[] args) { Vector numeros = new Vector(); char letras[] = new char[26]; List palavras = new ArrayList(); int cont=0; // Atribui dados ao Vector numeros for(int aux = 0; aux < 10; aux++) { numeros.add(aux); } // Atribui dados ao Array letras for(char letra ='a'; letra <= 'z'; letra++) { letras[cont] = letra; cont++; } // Atribui dados ao ArrayList palavras palavras.add("Ana Júlia"); palavras.add("Funciona"); palavras.add("Luis Inácio Lula da Silva"); /* Apresentação final dos dados na memória */ // Mostra dados do Vector System.out.println("Números armazenados no Vector: "); for (int aux=0; aux < numeros.size(); aux++){ System.out.print(numeros.get(aux)+" "); } // Mostra dados do Array System.out.println("\n_________________________________" + "\n\nLetras armazenadas no Array: \n"); for(char letra : letras) { System.out.print(letra+" "); } // Mostra dados do ArrayList System.out.println("\n_________________________________" + "\n\nPalavras armazenadas no ArrayList: \n"); for(Object palavra : palavras) { System.out.println(palavra); } } }
A execução do programa anterior esta representado na figura a seguir:
Com intuito de apoiar o aprendizado sobre Orientação a Objeto, sugere-se assistir a videoaula para o aperfeiçoamento no conhecimento deste conteúdo. |
Atividade de Fixação
No intuito de fixar estes novos conteúdos abordados até o momento e verificar sua compreensão sobre os mesmos, são sugeridos alguns exercícios de fixação para serem resolvidos, por meio do seu clique no link de exercícios ao lado que permitirá o início da lista de exercícios. Bom trabalho!!