Avatar billede psycosoft-funware Nybegynder
15. oktober 2006 - 22:14 Der er 8 kommentarer og
1 løsning

mere advanceret sortering mellem 2 listboxe

hej exp's

jeg sidder med et lille problem omkring sortering af tal.

jeg har en lang liste af talrækkersom flere stedergår igen.
det er så meningen at jeg har to memo'er hvor den ene bliver brugt til de usorterede tæalrækker mens den anden memo bliver brugt til at gemme de sorterede tal. men det der så er hele tanken bag er at den også skal se om talrækken eksistere i memo'en med de sorterede tal, og hvis talrækken eksistere skal den ikke tilføjes listen og vice versa.

har i noget kode der kan hjælpe mig på rette spor? :)

/psycosoft-funware :)


undskyld hvis min forklaring af problemet er lidt usammenhængene.
Avatar billede a_nor Nybegynder
16. oktober 2006 - 12:18 #1
ja, giv eksempler på hvordan de to memoer kan se ud, og den "nye" talrække du evt. vil have tilføjet kan se ud.
Avatar billede psycosoft-funware Nybegynder
17. oktober 2006 - 18:45 #2
Flowchart over sorterings algoritme.




Har man en liste med talrækker f.eks.
9652
3332587
6659545
666965
452158
88754
22256
66695
332658
666965
22256

Disse skal sorteres MEN som man ser går flg. Tal igen i eks. Oven for.
22256
666965

Det der så er meningen er at man har to memoer ved siden af hinanden hvor den til venstre skal bruges til det ”rå” input mens den højre skal bruges til det færdige resultat.
Men efter som at der kan være af talrækkerne der kan gå igen (som vist længere oppe) så skal de jo ikke tilføjes flere gange til den højre memo. Dvs. at samtidig med at der bliver taget en talrække i venstre side skal den også kontrollere om talrækken eksistere i den højre momo. (noget af la dette: hvis talrække 22256 eksistere i højre memo then tilføj ikke else tilføj)

til sist vil man så enden med en liste af talrækker hvor der kun eksistere een talrække af hver - det er VIGTIGT at en talrække ikke går igen flere steder ned gennem listen

/psycosoft-funware :)
Avatar billede psycosoft-funware Nybegynder
17. oktober 2006 - 18:46 #3
håber det hjalp lidt bedere på forståelsen :)
Avatar billede hrc Mester
20. oktober 2006 - 22:59 #4
En TStringList kan gøre det. Du kan for det første få den til at ignorere dubletter. Dernæst kan du lave en numerisk sortering på listen.

Man skal ikke sætte listen til at være sorteret fra starten for så bliver det alfanumerisk sortering (0, 1, 10, 2, 3 ...). Det er nok den simpleste metode, men du kan også smække tallene i en hash-liste (jep, sådan en har Delphi også) - og så bliver det ikke hurtigere (dvs. implementeringen er ikke den bedste, men den er der).

En TObjectListe bestående af TTalData objekter kunne også bruges.

Nedenstående er en Quick n' dirty løsning. For det første indeholder en streng-liste tal. Det er ikke kønt. Derefter så betyder "ignore duplicates" på en usorteret liste at den ved et tal der ikke findes i forvejen, bliver nødt til at gennemløbe hele listen. Det er grimt.

... men det virker; og du kan sikkert ikke se det.

procedure TfrmMain.ButtonClick(Sender: TObject);
var
  i : integer;
  StringList : TStringList;
begin
  StringList := TStringList.Create;
  try
    StringList.Duplicates := dupIgnore;
    for i := 0 to 1000 - 1 do
      StringList.Add(IntToStr(Random(1000000)));

    StringList.CustomSort(CompareInt);

    StringList.SaveToFile('c:\test.txt');

  finally
    StringList.Free;
  end;
end;
Avatar billede hrc Mester
20. oktober 2006 - 22:59 #5
Glemte lige denne del...

uses
  Math;

function CompareInt(aList: TStringList; aIndex1, aIndex2: integer) : integer;
begin
  result := CompareValue(StrToInt(aList[aIndex1]),StrToInt(aList[aIndex2]));
end;
Avatar billede psycosoft-funware Nybegynder
22. oktober 2006 - 18:20 #6
>>hrc: nu har jeg rodet lidt rundt med dit kode eks. men outputtet er ikke som forventet:
9652
22256
22256
66695
88754
332658
452158
666965
666965
3332587
6659545

i stedet for at fjerne dupletter, bliver de bare sorteret;
bruger flg. kode:

procedure TMainForm.BtnProcessClick(Sender: TObject);
var
  I: Integer;
  StringList: TStringList;
begin
  StringList := TStringList.Create;
  try
      StringList.Duplicates := dupIgnore;
      StringList.AddStrings(SourceMemo.Lines);
      for I := 0 to SourceMemo.Lines.Count - 1 do
      begin
        StringList.CustomSort(CompareInt);
        StringList.SaveToFile('c:\test.txt');
      end;
  finally
      StringList.Free;
  end;
end;

hvorfor kan jeg ikke få det til at spille sammen, hvor er det jeg nosser rundt i det? :)
Avatar billede hrc Mester
23. oktober 2006 - 09:14 #7
Et sted hvor du "nosser" lidt i det er din for-løkke. Du sorterer listen Count-gange og gemmer den ligeså mange gange.

Det dur i alt fald ikke.

Jeg har nu også klokket lidt i det for i dokumentationen står at dubIgnore ikke fungerer hvis ikke listen er sorteret (og her menes den alfanumeriske sortering som er standard, ikke den numeriske som jeg implementerer via CustumSort).

var
  i : integer;
  StringList : TStringList;
begin
  StringList := TStringList.Create;
  try
    StringList.Sorted := true;
    try
      StringList.Duplicates := dupIgnore;
      for i := 0 to 10000 - 1 do
        StringList.Add(IntToStr(Random(100)));
    finally
      StringList.Sorted := false;
    end;

    StringList.CustomSort(CompareInt);

    StringList.SaveToFile('c:\test.txt');

  finally
    StringList.Free;
  end;
Avatar billede psycosoft-funware Nybegynder
23. oktober 2006 - 19:32 #8
>>hrc: takker mange gange fordi du fulgte mit spm helt til dørs :D - nu blev jeg da det klogere på sortering med TStringList.
hele kildekoden plus komplieret program kan hentets her: http://www.megaupload.com/?d=CM4EF8FR

du har virkeligt fortjent 200 pts.

takker endnu en gang :D
Avatar billede psycosoft-funware Nybegynder
23. oktober 2006 - 19:39 #9
glemte at tilføje:
der hvor du belyste problemerne, kan jeg godt se det.. har vist bare ikke været vågen nok (flovt)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester