Fundamentos da Linguagem Java




           Vetores em Java
        Implementação de Estruturas de
                   Dados


            Ludimila Monjardim Casagrande
                        2012
Vetor

     Um vetor é uma lista implementada usando um
        array.
     O que são listas?
           Lista é uma estrutura de dados que, por
            definição, permite objetos duplicados e é
            ordenada.
     Uma estrutura de dados deve definir:
           A maneira como o dado será armazenado;
           A interface ou operações disponíveis para uso.

Vetores em Java          ©2012 Ludimila Monjardim Casagrande   2
Vetor

     Um array é uma porção de memória fixa e
        sequencial dividida em pedaços idênticos
        indexados a partir de 0.
     A capacidade de um array é fixa e deve ser
        informada no momento da criação do array.




Vetores em Java       ©2012 Ludimila Monjardim Casagrande   3
Vetor de Objetos

     Em cada posição do array (ou vetor), podemos
        guardar um objeto. Na verdade, cada posição
        pode guardar uma referência para um objeto.



                                                            Exemplo:
                                                            Array, vetor
                                                            ou lista de
                                                            Alunos.




Vetores em Java       ©2012 Ludimila Monjardim Casagrande                  4
O que vamos implementar?

     Vamos implementar um vetor para a listagem de
        Alunos.
     Para isso, precisamos primeiro implementar a
        classe Aluno.
     Em seguida, precisamos definir a interface da
        lista, isto é, as operações públicas disponíveis
        para a manipulação de dados nessa estrutura.




Vetores em Java         ©2012 Ludimila Monjardim Casagrande   5
Classe Aluno
  package poo.modelo;                                        @Override
  public class Aluno {                                       public String toString() {
       private int matricula;                                     return "Aluno [matricula=" + matricula + ", nome=" + nome + "]";
       private String nome;                                  }

       public Aluno(int matricula, String nome) {            @Override

             this.nome = nome;                               public boolean equals(Object obj) {

             this.matricula = matricula;                          if (this == obj) {

       }                                                                return true;
                                                                  }
       public int getMatricula() {
                                                                  if (obj == null) {
             return matricula;
                                                                        return false;
       }                                                          }
       public void setMatricula(int matricula) {                  if (!(obj instanceof Aluno)) {
             this.matricula = matricula;                                return false;
       }                                                          }
       public String getNome() {                                  Aluno a = (Aluno) obj;
             return nome;                                         if (matricula != a.matricula) {
       }                                                                return false;
                                                                  }
       public void setNome(String nome) {
                                                                  return true;
                                                                                                     Obs.: Incluir o
             this.nome = nome;                               }                                       construtor default.
       }                                                }

Vetores em Java                                ©2012 Ludimila Monjardim Casagrande                                               6
Operações da Lista

     Vamos implementar as seguintes operações:
           Adicionar um dado objeto no fim da lista;
           Adicionar um dado objeto em uma dada posição;
           Recuperar o objeto de uma dada posição;
           Remover o objeto de uma dada posição;
           Verificar se um dado objeto está contido na lista;
           Obter a quantidade de objetos (elementos) da
            lista.
           Imprimir a lista (implementar o método toString()).

Vetores em Java           ©2012 Ludimila Monjardim Casagrande     7
Estrutura da Classe Vetor
  package poo.estruturas;                                        public Aluno recupera(int posicao) {
  import poo.modelo.Aluno;                                            // TODO implementação
  public class Vetor {                                                return null;
       /** Declaração e inicialização de um array de             }
       * objetos do tipo Aluno
                                                                 public void remove(int posicao) {
       * com capacidade para 100 objetos. */
                                                                      // TODO implementação
       private Aluno[] alunos = new Aluno[100];
                                                                 }
                                                                 public boolean contem(Aluno aluno) {
       /** Numero atual de elementos do array. */
                                                                      // TODO implementação
       private int totalDeElementos;
                                                                      return false;
                                                                 }
       public void adiciona(Aluno aluno) {
                                                                 public int obtemTotalDeElementos() {
            // TODO implementação
                                                                      // TODO implementação
       }
                                                                      return 0;
       public void adiciona(int posicao, Aluno aluno) {
                                                                 }
            // TODO implementação
                                                             }
                                                                                     Obs.: Incluir também o
       }                                                                             método toString().

Vetores em Java                         ©2012 Ludimila Monjardim Casagrande                                   8
Considerações sobre o Vetor

     Considere que os elementos do vetor devam estar
        estão todos compactados à esquerda, isto é, não
        existem posições vazias entre as posições ocupadas.




Vetores em Java        ©2012 Ludimila Monjardim Casagrande    9
Classes para Teste
    package poo.testes;
    import poo.modelo.Aluno;
    import poo.estruturas.Vetor;

    public class TesteAdicionaNoFim {
         public static void main(String[] args) {
             Aluno a1 = new Aluno(100, "José");
             Aluno a2 = new Aluno(200, "João");
             Vetor lista = new Vetor();
             lista.adiciona(a1);
             lista.adiciona(a2);
             System.out.println(lista);                   Saída esperada:
         }                                                [Aluno [matricula=100, nome=José],
    }                                                     Aluno [matricula=200, nome=João]]


Vetores em Java                      ©2012 Ludimila Monjardim Casagrande                       10
Classes para Teste
    package poo.testes;
    import poo.modelo.Aluno;
    import poo.estruturas.Vetor;
    public class TesteAdicionaPorPosicao {
         public static void main(String[] args) {
             Aluno a1 = new Aluno(101, "Rafael");
             Aluno a2 = new Aluno(201, "Paulo");
             Aluno a3 = new Aluno(301, "Ana");
             Vetor lista = new Vetor();
             lista.adiciona(a1);
             lista.adiciona(0, a2);
             lista.adiciona(1, a3);                        Saída esperada:
             System.out.println(lista);                    [Aluno [matricula=201, nome=Paulo],
         }                                                 Aluno [matricula=301, nome=Ana],
    }                                                      Aluno [matricula=101, nome=Rafael]]

Vetores em Java                       ©2012 Ludimila Monjardim Casagrande                        11
Classes para Teste
  package poo.testes;
  import poo.modelo.Aluno;
  import poo.estruturas.Vetor;
  public class TesteRecuperaPorPosicao {
       public static void main(String[] args) {
            Aluno a1 = new Aluno(101, "Rafael");
            Aluno a2 = new Aluno(201, "Paulo");
            Vetor lista = new Vetor();
            lista.adiciona(a1);
            lista.adiciona(a2);
            Aluno aluno1 = lista.recupera(0);
            Aluno aluno2 = lista.recupera(1);
                                                          Saída esperada:
            System.out.println(aluno1);                   Aluno [matricula=101, nome=Rafael]
            System.out.println(aluno2);                   Aluno [matricula=201, nome=Paulo]
       }
  }
Vetores em Java                      ©2012 Ludimila Monjardim Casagrande                       12
Classes para Teste
   package poo.testes;
   import poo.modelo.Aluno;
   import poo.estruturas.Vetor;
   public class TesteRemovePorPosicao {
        public static void main(String[] args) {
             Aluno a1 = new Aluno(101, "Rafael");
             Aluno a2 = new Aluno(201, "Paulo");
             Vetor lista = new Vetor();
             lista.adiciona(a1);
             lista.adiciona(a2);
             lista.remove(0);
             System.out.println(lista);                    Saída esperada:
        }                                                  Aluno [matricula=201, nome=Paulo]
   }


Vetores em Java                       ©2012 Ludimila Monjardim Casagrande                      13
Classes para Teste
   package poo.testes;
   import poo.modelo.Aluno;
   import poo.estruturas.Vetor;
   public class TesteContemAluno {
        public static void main(String[] args) {
             Aluno a1 = new Aluno(101, "Rafael");
             Aluno a2 = new Aluno(201, "Paulo");
             Vetor lista = new Vetor();
             lista.adiciona(a1);
             lista.adiciona(a2);
             System.out.println(lista.contem(a1));
                                                                           Saída esperada:
             System.out.println(lista.contem(a2));                         true
             Aluno a3 = new Aluno(301, "Ana");                             true
             System.out.println(lista.contem(a3));                         false
        }
   }
Vetores em Java                      ©2012 Ludimila Monjardim Casagrande                     14
Classes para Teste
   package poo.testes;
   import poo.modelo.Aluno;
   import poo.estruturas.Vetor;
   public class TesteRecuperaTamanhoDaLista {
        public static void main(String[] args) {
             Aluno a1 = new Aluno(101, "Rafael");
             Aluno a2 = new Aluno(201, "Paulo");
             Aluno a3 = new Aluno();
             Vetor lista = new Vetor();
             lista.adiciona(a1);
             lista.adiciona(a2);
                                                                           Saída esperada:
             System.out.println(lista.obtemTotalDeElementos());            2
             lista.adiciona(a3);                                           3
             System.out.println(lista.obtemTotalDeElementos());
        }
   }
Vetores em Java                      ©2012 Ludimila Monjardim Casagrande                     15
Método: adiciona(Aluno aluno)




Possível
implementação:




Vetores em Java   ©2012 Ludimila Monjardim Casagrande   16
Método: adiciona(Aluno aluno)

     Problema da implementação anterior:
           O consumo de tempo do
            método piora proporcional-
            mente na medida em que
            o número de elementos
            que existem no vetor
            aumenta, o que representa
            um consumo linear de tempo.




Vetores em Java          ©2012 Ludimila Monjardim Casagrande   17
Complexidade de Algoritmos

     Consumo Linear x Consumo Constante:
           Consumo
            (ou complexidade) linear:
            proporcional ao número
            de elementos do vetor.
            Indicado por: O(n).
           Consumo (ou complexidade)
            constante: não varia em
            função do número de
            elementos do vetor.
            Indicado por: O(1).
                                                      Consumo Linear x Consumo Constante

Vetores em Java           ©2012 Ludimila Monjardim Casagrande                          18
Método: adiciona(Aluno aluno)

                                                              Implementação alternativa
                                                              com consumo (complexidade)
                                                              constante:




 Quantidade de elementos = Índice da
 primeira posição vazia




                                                  Implementação parcial. Ainda falta
                                                  verificar se o vetor está cheio, isto é,
                                                  se totalDeAlunos < alunos.length.

Vetores em Java                ©2012 Ludimila Monjardim Casagrande                           19
Método: adiciona(int posicao, Aluno aluno)




     Verifique se o vetor está cheio.
     Verifique se a posição desejada é válida. As posições válidas são
      as posições ocupadas e a primeira posição desocupada
      (=totalDeAlunos). Além disso, a posição desejada deve ser menor
      do que o tamanho do vetor.
     Se a posição desejada for a última posição válida, apenas adicione
      o elemento nesta posição.

Vetores em Java             ©2012 Ludimila Monjardim Casagrande            20
Método: adiciona(int posicao, Aluno aluno)




     Se a posição desejada for uma posição ocupada, desloque os
        elementos para a direita até desocupar a posição desejada. Por fim,
        adicione o elemento nesta posição e incremente o total de alunos.



Vetores em Java              ©2012 Ludimila Monjardim Casagrande              21
Método: recupera(int posicao)




     A dica em relação a esse método é primeiro verificar se a posição
      desejada é uma posição ocupada, isto é, se a posição pertence ao
      intervalo de 0 a totalDeAlunos - 1.
     Se sim, basta recuperar o objeto desta posição.




Vetores em Java             ©2012 Ludimila Monjardim Casagrande           22
Método: remove(int posicao)




     Verifique se a posição desejada é uma posição ocupada.
     Se for, remova o objeto alterando o valor da posição para null.
     Em seguida, desloque os objetos à direita do objeto removido uma
      posição para a esquerda, caso eles existam.
     Decremente o número total de alunos.

Vetores em Java            ©2012 Ludimila Monjardim Casagrande           23
Método: contem(Aluno aluno)




     Nesta operação, precisamos comparar o aluno dado com todos os
        alunos existentes no vetor.
     Para isso implemente um laço e compare os objetos usando o
        método equals.


Vetores em Java              ©2012 Ludimila Monjardim Casagrande      24
Caixas de Diálogo

     Você pode exibir mensagens de erro ou
        informativas para o usuário usando uma caixa
        de diálogo da seguinte forma:




Vetores em Java       ©2012 Ludimila Monjardim Casagrande   25
Referências

     CS-14: Algoritmos e Estruturas de Dados em Java.
        Caelum: Ensino e Inovação.
        http://www.caelum.com.br/curso/cs-14-algoritmos-estruturas-dados-
        java/

     Capítulo 4 – Arrays.
        Orientação a Objetos em Java.
        K19 Treinamentos.
        http://www.k19.com.br/downloads/apostilas-java.

     Capítulo 16 – Collections framework.
        Caelum: Ensino e Inovação.
        http://www.caelum.com.br/curso/fj-11-java-orientacao-objetos/


Vetores em Java              ©2012 Ludimila Monjardim Casagrande            26

POO - 14 - Vetores

  • 1.
    Fundamentos da LinguagemJava Vetores em Java Implementação de Estruturas de Dados Ludimila Monjardim Casagrande 2012
  • 2.
    Vetor  Um vetor é uma lista implementada usando um array.  O que são listas?  Lista é uma estrutura de dados que, por definição, permite objetos duplicados e é ordenada.  Uma estrutura de dados deve definir:  A maneira como o dado será armazenado;  A interface ou operações disponíveis para uso. Vetores em Java ©2012 Ludimila Monjardim Casagrande 2
  • 3.
    Vetor  Um array é uma porção de memória fixa e sequencial dividida em pedaços idênticos indexados a partir de 0.  A capacidade de um array é fixa e deve ser informada no momento da criação do array. Vetores em Java ©2012 Ludimila Monjardim Casagrande 3
  • 4.
    Vetor de Objetos  Em cada posição do array (ou vetor), podemos guardar um objeto. Na verdade, cada posição pode guardar uma referência para um objeto. Exemplo: Array, vetor ou lista de Alunos. Vetores em Java ©2012 Ludimila Monjardim Casagrande 4
  • 5.
    O que vamosimplementar?  Vamos implementar um vetor para a listagem de Alunos.  Para isso, precisamos primeiro implementar a classe Aluno.  Em seguida, precisamos definir a interface da lista, isto é, as operações públicas disponíveis para a manipulação de dados nessa estrutura. Vetores em Java ©2012 Ludimila Monjardim Casagrande 5
  • 6.
    Classe Aluno package poo.modelo; @Override public class Aluno { public String toString() { private int matricula; return "Aluno [matricula=" + matricula + ", nome=" + nome + "]"; private String nome; } public Aluno(int matricula, String nome) { @Override this.nome = nome; public boolean equals(Object obj) { this.matricula = matricula; if (this == obj) { } return true; } public int getMatricula() { if (obj == null) { return matricula; return false; } } public void setMatricula(int matricula) { if (!(obj instanceof Aluno)) { this.matricula = matricula; return false; } } public String getNome() { Aluno a = (Aluno) obj; return nome; if (matricula != a.matricula) { } return false; } public void setNome(String nome) { return true; Obs.: Incluir o this.nome = nome; } construtor default. } } Vetores em Java ©2012 Ludimila Monjardim Casagrande 6
  • 7.
    Operações da Lista  Vamos implementar as seguintes operações:  Adicionar um dado objeto no fim da lista;  Adicionar um dado objeto em uma dada posição;  Recuperar o objeto de uma dada posição;  Remover o objeto de uma dada posição;  Verificar se um dado objeto está contido na lista;  Obter a quantidade de objetos (elementos) da lista.  Imprimir a lista (implementar o método toString()). Vetores em Java ©2012 Ludimila Monjardim Casagrande 7
  • 8.
    Estrutura da ClasseVetor package poo.estruturas; public Aluno recupera(int posicao) { import poo.modelo.Aluno; // TODO implementação public class Vetor { return null; /** Declaração e inicialização de um array de } * objetos do tipo Aluno public void remove(int posicao) { * com capacidade para 100 objetos. */ // TODO implementação private Aluno[] alunos = new Aluno[100]; } public boolean contem(Aluno aluno) { /** Numero atual de elementos do array. */ // TODO implementação private int totalDeElementos; return false; } public void adiciona(Aluno aluno) { public int obtemTotalDeElementos() { // TODO implementação // TODO implementação } return 0; public void adiciona(int posicao, Aluno aluno) { } // TODO implementação } Obs.: Incluir também o } método toString(). Vetores em Java ©2012 Ludimila Monjardim Casagrande 8
  • 9.
    Considerações sobre oVetor  Considere que os elementos do vetor devam estar estão todos compactados à esquerda, isto é, não existem posições vazias entre as posições ocupadas. Vetores em Java ©2012 Ludimila Monjardim Casagrande 9
  • 10.
    Classes para Teste package poo.testes; import poo.modelo.Aluno; import poo.estruturas.Vetor; public class TesteAdicionaNoFim { public static void main(String[] args) { Aluno a1 = new Aluno(100, "José"); Aluno a2 = new Aluno(200, "João"); Vetor lista = new Vetor(); lista.adiciona(a1); lista.adiciona(a2); System.out.println(lista); Saída esperada: } [Aluno [matricula=100, nome=José], } Aluno [matricula=200, nome=João]] Vetores em Java ©2012 Ludimila Monjardim Casagrande 10
  • 11.
    Classes para Teste package poo.testes; import poo.modelo.Aluno; import poo.estruturas.Vetor; public class TesteAdicionaPorPosicao { public static void main(String[] args) { Aluno a1 = new Aluno(101, "Rafael"); Aluno a2 = new Aluno(201, "Paulo"); Aluno a3 = new Aluno(301, "Ana"); Vetor lista = new Vetor(); lista.adiciona(a1); lista.adiciona(0, a2); lista.adiciona(1, a3); Saída esperada: System.out.println(lista); [Aluno [matricula=201, nome=Paulo], } Aluno [matricula=301, nome=Ana], } Aluno [matricula=101, nome=Rafael]] Vetores em Java ©2012 Ludimila Monjardim Casagrande 11
  • 12.
    Classes para Teste package poo.testes; import poo.modelo.Aluno; import poo.estruturas.Vetor; public class TesteRecuperaPorPosicao { public static void main(String[] args) { Aluno a1 = new Aluno(101, "Rafael"); Aluno a2 = new Aluno(201, "Paulo"); Vetor lista = new Vetor(); lista.adiciona(a1); lista.adiciona(a2); Aluno aluno1 = lista.recupera(0); Aluno aluno2 = lista.recupera(1); Saída esperada: System.out.println(aluno1); Aluno [matricula=101, nome=Rafael] System.out.println(aluno2); Aluno [matricula=201, nome=Paulo] } } Vetores em Java ©2012 Ludimila Monjardim Casagrande 12
  • 13.
    Classes para Teste package poo.testes; import poo.modelo.Aluno; import poo.estruturas.Vetor; public class TesteRemovePorPosicao { public static void main(String[] args) { Aluno a1 = new Aluno(101, "Rafael"); Aluno a2 = new Aluno(201, "Paulo"); Vetor lista = new Vetor(); lista.adiciona(a1); lista.adiciona(a2); lista.remove(0); System.out.println(lista); Saída esperada: } Aluno [matricula=201, nome=Paulo] } Vetores em Java ©2012 Ludimila Monjardim Casagrande 13
  • 14.
    Classes para Teste package poo.testes; import poo.modelo.Aluno; import poo.estruturas.Vetor; public class TesteContemAluno { public static void main(String[] args) { Aluno a1 = new Aluno(101, "Rafael"); Aluno a2 = new Aluno(201, "Paulo"); Vetor lista = new Vetor(); lista.adiciona(a1); lista.adiciona(a2); System.out.println(lista.contem(a1)); Saída esperada: System.out.println(lista.contem(a2)); true Aluno a3 = new Aluno(301, "Ana"); true System.out.println(lista.contem(a3)); false } } Vetores em Java ©2012 Ludimila Monjardim Casagrande 14
  • 15.
    Classes para Teste package poo.testes; import poo.modelo.Aluno; import poo.estruturas.Vetor; public class TesteRecuperaTamanhoDaLista { public static void main(String[] args) { Aluno a1 = new Aluno(101, "Rafael"); Aluno a2 = new Aluno(201, "Paulo"); Aluno a3 = new Aluno(); Vetor lista = new Vetor(); lista.adiciona(a1); lista.adiciona(a2); Saída esperada: System.out.println(lista.obtemTotalDeElementos()); 2 lista.adiciona(a3); 3 System.out.println(lista.obtemTotalDeElementos()); } } Vetores em Java ©2012 Ludimila Monjardim Casagrande 15
  • 16.
    Método: adiciona(Aluno aluno) Possível implementação: Vetoresem Java ©2012 Ludimila Monjardim Casagrande 16
  • 17.
    Método: adiciona(Aluno aluno)  Problema da implementação anterior:  O consumo de tempo do método piora proporcional- mente na medida em que o número de elementos que existem no vetor aumenta, o que representa um consumo linear de tempo. Vetores em Java ©2012 Ludimila Monjardim Casagrande 17
  • 18.
    Complexidade de Algoritmos  Consumo Linear x Consumo Constante:  Consumo (ou complexidade) linear: proporcional ao número de elementos do vetor. Indicado por: O(n).  Consumo (ou complexidade) constante: não varia em função do número de elementos do vetor. Indicado por: O(1). Consumo Linear x Consumo Constante Vetores em Java ©2012 Ludimila Monjardim Casagrande 18
  • 19.
    Método: adiciona(Aluno aluno) Implementação alternativa com consumo (complexidade) constante: Quantidade de elementos = Índice da primeira posição vazia Implementação parcial. Ainda falta verificar se o vetor está cheio, isto é, se totalDeAlunos < alunos.length. Vetores em Java ©2012 Ludimila Monjardim Casagrande 19
  • 20.
    Método: adiciona(int posicao,Aluno aluno)  Verifique se o vetor está cheio.  Verifique se a posição desejada é válida. As posições válidas são as posições ocupadas e a primeira posição desocupada (=totalDeAlunos). Além disso, a posição desejada deve ser menor do que o tamanho do vetor.  Se a posição desejada for a última posição válida, apenas adicione o elemento nesta posição. Vetores em Java ©2012 Ludimila Monjardim Casagrande 20
  • 21.
    Método: adiciona(int posicao,Aluno aluno)  Se a posição desejada for uma posição ocupada, desloque os elementos para a direita até desocupar a posição desejada. Por fim, adicione o elemento nesta posição e incremente o total de alunos. Vetores em Java ©2012 Ludimila Monjardim Casagrande 21
  • 22.
    Método: recupera(int posicao)  A dica em relação a esse método é primeiro verificar se a posição desejada é uma posição ocupada, isto é, se a posição pertence ao intervalo de 0 a totalDeAlunos - 1.  Se sim, basta recuperar o objeto desta posição. Vetores em Java ©2012 Ludimila Monjardim Casagrande 22
  • 23.
    Método: remove(int posicao)  Verifique se a posição desejada é uma posição ocupada.  Se for, remova o objeto alterando o valor da posição para null.  Em seguida, desloque os objetos à direita do objeto removido uma posição para a esquerda, caso eles existam.  Decremente o número total de alunos. Vetores em Java ©2012 Ludimila Monjardim Casagrande 23
  • 24.
    Método: contem(Aluno aluno)  Nesta operação, precisamos comparar o aluno dado com todos os alunos existentes no vetor.  Para isso implemente um laço e compare os objetos usando o método equals. Vetores em Java ©2012 Ludimila Monjardim Casagrande 24
  • 25.
    Caixas de Diálogo  Você pode exibir mensagens de erro ou informativas para o usuário usando uma caixa de diálogo da seguinte forma: Vetores em Java ©2012 Ludimila Monjardim Casagrande 25
  • 26.
    Referências  CS-14: Algoritmos e Estruturas de Dados em Java. Caelum: Ensino e Inovação. http://www.caelum.com.br/curso/cs-14-algoritmos-estruturas-dados- java/  Capítulo 4 – Arrays. Orientação a Objetos em Java. K19 Treinamentos. http://www.k19.com.br/downloads/apostilas-java.  Capítulo 16 – Collections framework. Caelum: Ensino e Inovação. http://www.caelum.com.br/curso/fj-11-java-orientacao-objetos/ Vetores em Java ©2012 Ludimila Monjardim Casagrande 26