Array
(
)

Contar a repetição em um txt

Fabiano_aprendiz
   - 14 set 2004

Caros colegas, estou com a seguinte dúvida: Tenho um arquivo txt com dezenas de números e a maioria desses números se repetem por várias vz. Criei uma TStringList, agora gostaria de saber, como faço para poder contar a ocorrência de cada um dos números.
Ex: o número 5 se repetiu 10 vz, o 8 repetiu 6.
Agradeço a ajuda.
Fabiano.


Rômulo Barros
   - 14 set 2004

#Código

procedure TfrmOpe5EstrelasMais.Button1Click(Sender: TObject);
Var
strLstTeste : TStrings;
intC : Integer;
vetValores : Arrayy[0..9] Of Integer;
begin
inherited;
Try
strLstTeste := TStringList.Create;
strLstTeste.Add(´0´);
strLstTeste.Add(´1´);
strLstTeste.Add(´2´);
strLstTeste.Add(´2´);
strLstTeste.Add(´3´);
strLstTeste.Add(´3´);
strLstTeste.Add(´3´);
strLstTeste.Add(´4´);
strLstTeste.Add(´4´);
strLstTeste.Add(´4´);
strLstTeste.Add(´4´);
strLstTeste.Add(´5´);
strLstTeste.Add(´5´);
strLstTeste.Add(´5´);
strLstTeste.Add(´5´);
strLstTeste.Add(´5´);
For intC := 0 To strLstTeste.Count -1 Do
Begin
vetValores[StrToInt(strLstTeste[intC])] := vetValores[StrToInt(strLstTeste[intC])] + 1;
End;
For intC := 0 To Length(vetValores) -1 Do
ShowMessage(´Total de "´ + IntToStr(intC) + ´" no TStrings: ´ + IntToStr(vetValores[intC]));
Finally
FreeAndNil(strLstTeste);
End;


:wink: :wink: :wink: :wink: :wink:


Fabiano_aprendiz
   - 15 set 2004

Caro Colega,
Estou tentando testar sua solução, mas quando rodo a aplicação, o vetor já icializa com um monte de lixo (creio q seja da memória), como fazer para zerar um vetor ao iniciar a aplicação?


Rômulo Barros
   - 15 set 2004

Também percebi isto, mas naum sei porque acontece. Para solucionar este problema, declar o Vetor na seção Public de seu formulário.

:wink: :wink: :wink: :wink: :wink:


Fabiano_aprendiz
   - 15 set 2004

Funcionou, fico muito agradecido msmo!! Agora sem querer abusar muito to tentando dar uma sofisticada, tipo colocar os números q sairam em ordem decrescente, poderia me dar mais essa dica?
[]´s
Fabiano


Sandra
   - 15 set 2004


Citação:
Caro Colega,
Estou tentando testar sua solução, mas quando rodo a aplicação, o vetor já icializa com um monte de lixo (creio q seja da memória), como fazer para zerar um vetor ao iniciar a aplicação?

Citação:
Também percebi isto, mas naum sei porque acontece. Para solucionar este problema, declar o Vetor na seção Public de seu formulário.

:wink: :wink: :wink: :wink: :wink:

Undeclared,

Não seria o caso de inicializar o vetor, antes da utilização? :roll:
Mais ou menos assim:
#Código

begin 
inherited;
For IntC := 0 To 9 do
vetValores[IntC] := 0; // zerar os elementos do array vetValores
Try
.
.
.

PS: Aproveitei o IntC do tipo inteiro. :mrgreen:


Beppe
   - 15 set 2004

Façam como a Sandra sugeriu. A diferença é que variáveis locais não são zeradas, então o programador necessita fazer isto explicitamente. Já campos de classes, e variáveis globais(sem atribuição do programador) são sempre inicializadas com zero.

Uma alternativa, sem precisar de loop´s é FillChar(Sua_Variavel, SizeOf(Sua_Variavel), 0)


Fabiano_aprendiz
   - 15 set 2004

Pessoal, consegui o q queria com a ajuda do nosso colega aí em cima, o código ficou assim:

begin
Try
Lista:= TStringList.Create;
Lista.LoadFromFile (ExtractFileName(´numeros.txt´));

For C := 0 To Lista.Count -1 Do
Begin
vetValores[StrToInt(Lista[C])] := vetValores[StrToInt(Lista[C])] + 1;
End;

For C := 0 to Length(vetValores) -1 Do
Begin
ListBox1.Items.Add(´Total de ´´ + IntToStr(C) + ´´ sorteados: ´ + IntToStr(vetValores[C]));
end;
Finally
FreeAndNil(Lista);
End;
end;

Da forma como foi implementado, o resultado está assim:
Total de ´1´ sorteados: 40
Total de ´2´ sorteados: 48
Total de ´3´ sorteados: 35
Agora to tentando ordenar isso por ordem decrescente, digo ordenar pelos números q sairam mais vz. Ex:
Total de ´13´ sorteados: 70
Total de ´20´ sorteados: 68
Total de ´48´ sorteados: 67
Alguem sabe como me ajudar?
Agradeço a todos,
Fabiano.