VB .NET - Apresentando a classe Queue (Fila)


  Neste artigo vou abordar os principais conceitos sobre filas representadas pela classe Queue.

Vamos começar o artigo definindo o que são filas.

A classe Queue representa uma coleção de objetos  FIRST IN, FIRST OUT (FIFO) enfileirados , ou seja o primeiro que entra é o primeiro que sai.

Essa classe implementa uma fila como uma matriz circular usando o método Queue() para inicializar uma nova instância da classe que será vazia, e, irá possuir uma capacidade inicial e um fator de crescimento.

A capacidade de uma fila é o número de elementos que a fila pode conter. Conforme os elementos são adicionados a uma fila, a capacidade é aumentada automaticamente conforme necessário através da realocação.

Nota: A capacidade pode ser diminuída através do método TrimToSize().

O fator de crescimento é o número pelo que a capacidade atual é multiplicada quando uma maior capacidade for necessária. Ele é determinado quando a fila é construída; o fator de crescimento padrão é 2.0, assim, capacidade de uma fila aumentará sempre, pelo menos, a um mínimo de quatro, independentemente do fator de crescimento.

Uma fila com um fator de crescimento igual a 1,0 irá sempre aumentar em capacidade de um valor igual a 4 quando uma capacidade maior for requerida.

Quando usar fila  ?

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando o projeto no VS Community

Abra o VS Community e clique em New Project;

Selecione a linguagem Visual Basic e o template Console Application;

Informe o nome da solução como Filas clique no botão OK;

Criando e tratando Filas

Dim minhaFila as new Queue()

Objetos armazenados numa fila são inseridos numa extremidade e removidos a partir de outra extremidade: (FIFO)

Na figura temos os métodos :

  1. Enqueue() - que adiciona objetos no fim da fila (Queue)

  2. Dequeue() - que remove e retorna objetos do início da fila (Queue)

Dim minhaFila as new Queue()
minhaFila.Enqueue("Macoratti")
minhaFila.Enqueue("Quase")
minhaFila.Enqueue("Tudo para")
minhaFila.Enqueue("Visual basic")

Para remover e exibir objetos da fila podemos usar o seguinte código:

Console.WriteLine("(Dequeue) {0}", minhaFila.Dequeue())
Console.WriteLine("(Dequeue) {0}", minhaFila.Dequeue())
Console.WriteLine("(Dequeue) {0}", minhaFila.Dequeue())
Console.WriteLine("(Dequeue) {0}", minhaFila.Dequeue())

Observe que não usamos o método Add para incluir um objeto na fila mas sim o método Enqueue.

Para acessar um objeto na fila não usamos índice nem chave ; simplesmente recuperamos o primeiro da fila e depois o próximo e assim por diante. Usamos para isto o método Dequeue.

Esse método não só obtém o objeto da fila mas também remove o objeto da coleção. Assim ao chamar o método novamente você pega o próximo objeto.

Podemos também exibir os objetos contidos na fila usando um laço for/next , neste caso os objetos são apenas exibidos e não removidos:

For Each elemento As String In minhaFila
   Console.WriteLine(elemento)
Next

Você pode comparar a classe Queue com as pessoas que estão esperando em uma fila. A primeira pessoa que chega é a primeira a ser atendida , toda pessoa que chega é atendida na ordem de chegada.

Este mecanismo é chamado FIFO : first in first out (primeiro a chegar, primeiro a sair).

Esta classe permite tratar coleções de objetos fracamente tipados que são ordenadas pela ordem no qual eles são incluídos na coleção.

O código abaixo mostra como incluímos e acessamos objetos em uma fila:

        Dim cliente As New Queue
        cliente.Enqueue(New Clientes("Macoratti", "macoratti@yahoo.com"))
        cliente.Enqueue(New Clientes("Jefferson", "jeff123@yahoo.com"))
        Dim primeiro As Clientes = cliente.Dequeue
        Dim segundo As Clientes = cliente.Dequeue
        Console.WriteLine(primeiro.Nome)
        Console.WriteLine(segundo.Nome)
        Console.ReadLine()

O método Peek() retorna o objeto do início da fila sem removê-lo.

O método Contains() determina se um elemento esta em uma fila.

Exemplo:

      Dim queueLista As New Queue

        queueLista.Enqueue("Dom")
        queueLista.Enqueue("Seg")
        queueLista.Enqueue("Ter")
        queueLista.Enqueue("Qua")
        queueLista.Enqueue("Qui")
        queueLista.Enqueue("Sex")
        queueLista.Enqueue("Sab")
        Console.WriteLine(queueLista.Peek())
        If queueLista.Contains("Dom") Then
            Console.WriteLine("Contém Dom")
        Else
            Console.WriteLine("Não contém Dom")
        End If
        Console.ReadKey()

O método Clear() remove todos os elementos da fila.

A propriedade Count() retorna o número de elementos da fila.

O método CopyTo() copia os elementos da fila para um array unidimensional existente no índice especificado do array.

Exemplo:

        ' Cria uma nova fila
        Dim fila As Queue(Of Integer) = New Queue(Of Integer)()
        fila.Enqueue(5)
        fila.Enqueue(10)
        fila.Enqueue(20)
        fila.Enqueue(99)
        'exibe quantos elementos tem a fila
        Console.WriteLine("A fila contém {0} elementos.", fila.Count)
        ' Cria um array 
        Dim meuArray(fila.Count - 1) As Integer
        ' Copia os elementos da fila para o array
        fila.CopyTo(meuArray, 0)
        'limpando a fila
        fila.Clear()
        'exibindo o conteúdo do array
        For Each elemento As Integer In meuArray
            Console.WriteLine(elemento)
        Next
        Console.ReadKey()

Nota: Para garantir a segurança da thread da fila, todas as operações devem ser feitas através do invólucro retornado pelo método Synchronized().

 Pegue o projeto completo aqui :   Filas.zip

Porque a palavra de Deus é viva e eficaz, e mais penetrante do que espada alguma de dois gumes, e penetra até à divisão da alma e do espírito, e das juntas e medulas, e é apta para discernir os pensamentos e intenções do coração.
Hebreus 4:12

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti