Delphi Kolejność Liczb od powtórzeń

0

Witam,
Mam pewien problem do rowiązania, w Tmemo mam załadowany
zbiór liczb w postaci:
43 23 12 42 88
33 22 11 55 88
itd..
i potrzebuję z tego zbioru wyświetlić,
W Memo2 ile razy dana liczba sie powtarza tzn
liczba która powtórzyła się najwięcej razy jest pierwsza potem druga i trzecia i aż wszystkie zostaną wyświetlone.
w kolejności od największej do najmniej powtarzalności.
Wyświetlanie nie musi być w Memo, może jest do tego jakiś lepszy komponent?

0

Wyświetlanie nie musi być w Memo, może jest do tego jakiś lepszy komponent?

RichEdit, SynEdit...

0

zmieniłem Memo1,2 na richedit co dalej niezbyt rozumiem jak to zroobić, dopiero zaczynam progrmaowąc.

0

Trzeba trochę poszukać, poczytać i porpróbwać samodzielnie, a nie od razu
się poddawać, nawet będąc początkującym. Masz przykład, pojmiesz ideę:

function Explode(Str : string; Separator : string) : TStringList;
var
  X : integer;
begin
  Result := TStringList.Create;
  Str := StringReplace(Str, #13#10, Separator, [rfReplaceAll]);
  X := Pos(Separator, Str);
  while X > 0 do
  begin
    Result.Add(Copy(Str, 1, X - 1));
    if X <= Length(Str) then
    begin
      Str := Copy(Str, X + Length(Separator), Length(Str));
    end;
    X := Pos(Separator, Str);
  end;
  if (Length(Str) > 0) then
  begin
    Result.Add(Str);
  end;
end;

procedure TForm1.Button1Click(Sender : TObject);
var
  S, EOL : string;
  I, Idx, Cnt : integer;
  SL, Res : TStringList;
begin
  Res := TStringList.Create;
  SL := Explode(RichEdit1.Text, ' ');
  for I := 0 to SL.Count - 1 do
  begin
    S := SL[I];
    Idx := Res.IndexOf(S);
    if Idx = -1 then
    begin
      Res.AddObject(S, TObject(Integer(1)));
    end
    else
    begin
      Cnt := Integer(TObject((Res.Objects[Idx])));
      Cnt := Cnt + 1;
      Res.Objects[Idx] := TObject(Integer(Cnt));
    end;
  end;
  S := '';
  for I := 0 to Res.Count - 1 do
  begin
    Cnt := Integer(TObject(Res.Objects[I]));
    if I < SL.Count - 1 then
    begin
      EOL := #13#10;
    end
    else
    begin
      EOL := '';
    end;
    S := S + 'Liczba ' + SL[I] + ' ilośc: ' + IntToStr(Cnt) + EOL;
  end;
  if S <> '' then
  begin
    ShowMessage(S);
  end;
  SL.Free;
  Res.Free;
end;
0

tak, sobie działa wyjscie dałem do richedit2.
i dostaje.
Liczba 39 7 47 24 ilośc: 1
Liczba 29 33 38 42 ilośc: 1
Liczba 18 8 39 12 ilośc: 1
Liczba 16 25 2 3 ilośc: 1
Liczba 12 44 45 41 ilośc: 1
Liczba 37 46 19 27 ilośc: 1
Liczba 46 48 18 7 ilośc: 1

A to ma mi w richedit2 wyswietlić
W kolejności od najwiekszej powtarzalności
np.
gdy mamy
23 3 4 5
23 7 4 8
23 7 1 12

To w richedit2 ma byc

23 -3razy
4-2razy
7-2razy
3-1razy
12-1razy
8-razy
1-razy

0

Chcesz mieć według kolejności wystąpień to posortuj sobie TStringList - a jak to zrobić
pokazuje przykład na: http://www.swissdelphicenter.ch/torry/showcode.php?id=1664

0

tak, ale nawet bez sortowania nie pokazuje dobrze,
aha i jak wyświetlić postęp operacji na gauge? nie zbyt wiem właśnie, niechciałbym tak dla picu dać odliczania tylko postęp operacji bo tam mam być kilka tyśięcy liczb.

0

W richedit2
Powinno znajdować się 20liczb ułozonych z kolejności zależnej od ilości i ilość podana z boku,
Bo w tym kodzie co dałeś program nie zlicza zawsze jest ilosc; 1

0

Kod dłuższy niż jedna linijka zawsze najpierw testuje w IDE dopiero później wklejam na forum.
Kod jest sprawdzony i działa. Jeżeli jednak Tobie się nie podoba to dopasuj go sobie tak aby
działał jak Tobie potrzeba, a jak nie to napisz po swojemu od zera. Bo dla danych w RichEdit:

43 23 12 42 88
33 22 11 55 88
43 23 12 42 88
33 22 11 55 88

Podaje wyniki:

---------------------------
Project1
---------------------------
Liczba 43 ilośc: 2
Liczba 23 ilośc: 2
Liczba 12 ilośc: 2
Liczba 42 ilośc: 2
Liczba 88 ilośc: 4
Liczba 33 ilośc: 2
Liczba 22 ilośc: 2
Liczba 11 ilośc: 2
Liczba 55 ilośc: 2

---------------------------
OK   
---------------------------

Także działa jak należy. Chcesz aby działał inaczej to jak wspomniałem kombinuj.

0

A jak dam liczby
39 7 47 24 19 15
29 33 38 42 12 14
18 8 39 12 47 5
16 25 2 3 38 40
12 44 45 41 14 23
37 46 19 27 24 34
46 33 18 7 5 36
16 39 31 21 37 42
To otrzymuje
Liczba 39 7 47 24 19 15 ilośc: 1
Liczba 29 33 38 42 12 14 ilośc: 1
Liczba 18 8 39 12 47 5 ilośc: 1
Liczba 16 25 2 3 38 40 ilośc: 1
Liczba 12 44 45 41 14 23 ilośc: 1
Liczba 37 46 19 27 24 34 ilośc: 1
Liczba 46 33 18 7 5 36 ilośc: 1
Liczba 16 39 31 21 37 42 ilośc: 1

0

Już wiem chodzi o odstępy między liczbami, a jeśli nie znamy jakie są odstępy raz może być 5 spacji a raz 2spacje odstępu.

0

To dostosuj sobie kod funkcji tak aby sprawdzał, czy następny
po separatorze nie jest jakiś inny znak albo skorzystaj także z
wyrażęń regularnych. Moduł z dokumentacją i przykładami jest
na: http://www.mediafire.com/file/czhw3mmzjyn/regexpr.rar

1 użytkowników online, w tym zalogowanych: 0, gości: 1