Set of - Conjunto

Delphi

03/08/2005

eu tenhu o seguinte caso:

type
TUniverso = (a, b, c, d, e, f);
TConjunto = set of TUniverso;

var
Conj: TConjunto;

begin
Conj := [d, b, f];
if (a in Conj) then ShowMessage(´a´);
if (b in Conj) then ShowMessage(´b´);
if (c in Conj) then ShowMessage(´c´);
if (d in Conj) then ShowMessage(´d´);
if (e in Conj) then ShowMessage(´e´);
if (f in Conj) then ShowMessage(´f´);
end;

voces devem concodar comigo q essa é uma maneira meia ´burra´ de se fazer isso, pois se o meu universo for um pouco maior a coisa vai complicar.

alguem sabe alguma maneira de saber os items da enumeracao q existem dentro do conjunto??
tipo um for, um while... quanquer coisa... o q eu preciso eh ´percorrer´ o conjunto.


Night_man

Night_man

Curtidas 0

Respostas

Michael

Michael

03/08/2005

Olá colega!

As únicas funções de manipulação de conjuntos que eu conheço no Delphi são [b:45bde2e4e7]Include [/b:45bde2e4e7]e [b:45bde2e4e7]Exclude[/b:45bde2e4e7], que servem para incluir ou excluir um elemento, respectivamente. É uma saída para não ter q usar [i:45bde2e4e7]Conjunto := Conjunto + [Elemento].[/i:45bde2e4e7]

Mas, sets não existem para armazenar grandes quantidades de elementos. Portanto, eu aconselho vc usar uma array - estática ou dinâmica, dependendo da sua aplicação - pois a flexibilidade de manipulação é bem maior.

Em arrays vc pode fazer um loop por todos os seus itens.

[]´s


GOSTEI 0
Massuda

Massuda

03/08/2005

Imagino que na prática o que você está querendo não seja mostrar uma mensagem com o nome do item... nesse caso, dá para fazer algo assim...
type
  TUniverso = (a, b, c, d, e, f);
  TConjunto = set of TUniverso;

var
  I: TUniverso;
  Conj:  TConjunto;

begin
  Conj := [d, b, f];

  for I := Low(I) to High(I) do begin
    if I in Conj then begin
      // trata o caso de I estar no conjunto
    end;
  end;
...



GOSTEI 0
Michael

Michael

03/08/2005

Boa Massuda!

Não sabia q se podia tratar Sets desta forma. Vivendo e aprendendo... ;-)

[]´s


GOSTEI 0
Night_man

Night_man

03/08/2005

valeu pela ajuda... mas a enumeracao eu sabia que era possivel percorrer assim...

estou usando ateh o ssuc e o pred tipo

Atual := a;
while (Atual <> d) do
Atual := Succ(Atual)


o problema eh o seguinte... o meu universo tem 200 items....
e nao estava a fim de testar ver se cada um deles esta no conjunto... eh perda de tempo... pois no maximo vao existir uns 5 deles...

logo queria pegar apenas esses 5....


GOSTEI 0
Beppe

Beppe

03/08/2005

Sets comportam no máximo 256 ítems. Caso mais for preciso, tem TBits como alternativa.

Mas se a distribuição for esparsa, a operação que deseja pode ser lenta. Há várias estruturas de dados para implementar SETS, entre elas mapa de bits(os sets no Delphi), arrays, listas encadeadas, hashtables, cada um com pontos fortes e fracos. Uma operação que for rápida em uma, pode ser lenta em outra, e vice-versa.

Por isso, verifique se há a real necessidade de mudar seu código(otimização antecipada é a raiz de todo mal). Duzentos é um universo pequeno, só será problema se a operação for repetida várias vezes em curto espaço de tempo.

Se eu quisesse uma iteração rápida, usaria um array não-ordenado apenas com os ítems inclusos. Se quisesse um teste MEMBRO-DE eficiente, usuria em conjunção com um mapa de bits. Neste caso, duas estruturas reduntantes seriam usadas, apenas para obter a melhor performance.


GOSTEI 0
POSTAR