VoidByte

Programar é pensar, muito mais que codificar

Arquivos de tags: algoritmo

Pilhas, filas e listas (Parte III)

A parte sobre listas encerra nosso tutorial, mas não encerra o assunto. Questões diversas sobre performance e gerenciamento de memória  podem ser abordadas em artigos futuros.

Listas para todos

Seja a lista de procurados do FBI ou uma simples lista de feira, toda lista precisa satisfazer algum critério e obedecer certa ordem para ser útil.

Uma lista funcional deve permitir incluir e excluir itens. Deve fornecer um método de ordenação para uma busca em seu conteúdo. Geralmente é fornecido também um método para modificar a posição do item se for necessário.

Há um grupo de classes no Delphi que fornecem a implementação de uma lista básica com os requisitos acima. Este grupo inclui entre outras a TList, TStringList e a classe que nos interessa : TObjectList.

Listando e controlando

Quando falamos de filas e pilhas, estamos falando na verdade de uma lista de elementos que seguem uma ou mais regras de ordenação ou tratamento.

Conhece algum programador que nunca tenha precisado usar uma lista qualquer? Isto torna evidente que fazer ou consultar uma lista é um ato comum na vida, e o mesmo acontece na programação.

Haverá momentos em que será interessante implementar nossas próprias regras de ordem ou de controle em uma lista. Neste caso podemos fazer o seguinte :

  1. Usar como base uma classe que implementa uma lista
  2. Adicionar métodos que implementem as regras necessárias.

No exemplo prático vamos aprender a usar a classe TObjectList. A partir do exemplo será possível acrescentar outros métodos específicos. Antes de mais nada, é preciso conhecer os métodos nativos.

Métodos

  • ADD – Coloca objeto na lista.
  • PEEK – Retorna o objeto a mais tempo na fila.
  • FIRST – Retorna o primeiro objeto da fila.
  • LAST – Retorna o último objeto da lista.
  • REMOVE – Retira o objeto da lista com o índice determinado.
  • COUNT – Conta quantos objetos estão armazenados.
  • CLEAR – Limpa a lista, excluindo todos os objetos

A propriedade OwnsObjects é de interesse especial, pois afeta o modo como os métodos REMOVE e CLEAR funcionam.

Caso o valor desta propriedade seja:

True : A memória de cada será liberada quando este for removido.
A memória de itens não removidos será liberada quando CLEAR for acionado.
False : A aplicação terá de liberar a memória dos itens antes destes serem removidos.

Isto significa que mudar o valor da propriedade para False e não chamar o método Free de cada item antes de removê-lo da lista resultará em desperdício de memória.

Modo de Usar:

  • – Crie o objeto TObjectList
  • – Adicione um objeto usando o método add()
  • – Manipule / modifique o objeto usando seu índice – TobjectList( índice )
  • – Retire o objeto da fila usando Remove();
  • – Exclua os itens usando Clear();
  • – Destrua a lista usando Free();

Certifique-se de destruir os objetos que retirar.

Ao sair da aplicação, remova todos os objetos da lista.
Libere a memória usada pelos objetos armazenados.

procedure TForm1.ExemploLista;
var
  Pessoa : TPessoa;
  Lista : TObjectList;
begin
// Exemplo lista.
// O parâmetro passado no Create da lista 
// será usado na propriedade OwnsObjects.

  Lista := TObjectList.Create(False);
  try
    Pessoa := TPessoa.Create;
    Pessoa.Nome := 'Pessoa 1';
    // adiciona objeto pessoa á Lista
    Lista.Add(pessoa);
    Pessoa := TPessoa.Create;
    Pessoa.Nome := 'Pessoa 2';
    // adiciona objeto pessoa á Lista
    Lista.Add(pessoa);
    // Mostra quantos objetos estão armazenados.
    ShowMessage('Lista Pessoas :' + 
                 IntToStr(Lista.Count));
    // Obtem o primeiro objeto pessoa da lista.
    Pessoa := TPessoa(Lista.First);
    // Mostra atributo nome.
    ShowMessage ('Nome da pessoa '+ pessoa.Nome);
    //retira o objeto da Lista
    (Lista.Remove(Pessoa));
    // Libera Memória
    Pessoa.Free;
    // Obtém o último objeto pessoa  da lista.<br />
    Pessoa := TPessoa(Lista.Last);
    // Mostra quantos o atributo nome.
    ShowMessage ('Nome da pessoa '+ pessoa.Nome);
    //retira o objeto da Lista
    Lista.Remove(Pessoa));
    // Libera memória<br />   
    Pessoa.Free;
  finally
  Lista.Free;
  end;
end;

Onde uso isto?

O uso de listas é limitado apenas por sua imaginação. Conhecendo a fundo a classe TObjectList será possível criar os mais diversos tipos de listas de objetos. Poderá ter listas que podem ser ordenadas em qualquer ordem e seguindo qualquer critério lógico.

Deixo alguns desafios interessantes pra treinar o uso de listas específicas:

  • Cotações da Bolsa, onde os itens mudam de posição a todo tempo.
  • Usuários conectados a um bate-papo, onde há relações mutantes entre os itens.
  • Listas de conexões de elementos em uma fórmula química.

Pra fechar esta série de artigos, clique
aqui
para obter o código fonte referente a todos os artigos.

Sugestões e comentários são bem vindos.
Até a próxima!

Engenharia de Software

Este blog tem como meta apresentar algumas discussões e opiniões relacionadas a engenharia de software. O blog foi criado pelo professor José Augusto Fabri da Universidade Tecnológica Federal do Paraná em 2008. Espero que vocês aproveitem os textos aqui apresentados.

Roberto Schneiders

A blog about experiences on software development

Meu mundo - Carlos Eduardo

Just another WordPress.com weblog

Delphi, Delphi Prism, Visual Studio, C#, ASP.NET

Para todos aqueles amantes da arte do desenvolvimento de Software.

Anderson Silva

Tecnologia da informação pra quem gosta de TI

reGIFELix

Alimentando o vicio pela informação e conhecimento em Java e Web Design

Diego Garcia

Delphi, Scrum, Arquitetura de Software e um pouco mais...

Ricardo Boaro

Embarcadero MVP

Blog do Fusco

Visões sobre Transformação Digital, Empreendedorismo, Inovação e Tecnologia da Informação

Leandro Cunha facts

Meu mundo virtual

simasware blog

Desenvolvimento e Software Livre