Avatar billede mysitesolution Nybegynder
20. januar 2003 - 21:16 Der er 15 kommentarer og
1 løsning

Sorter årstal

Jeg har lavet en procedure som får en tstringlist som fx kan se ud som denne:

1999
1998
1989
2002
2001
2001
2003

min kode laver det så om i en stringlist som hedder NewList, det skal komme til at se ud som dette:

1989
1998
1999
2001
2003

problemet er så at min kode virker ikke helt, hvorfor ved jeg ikke


Min kode er:
procedure YearList(List: tstringlist);

var
NewList: tstringlist;
i,j,l: integer;
Find: integer;
begin
Find := 0;
      NewLIst := tstringlist.Create;
        for i := 0 to List.Count - 1 do
        begin
                for j := 0 to NewList.Count - 1 do
                begin
                        if Find = 0 then
                        begin
                                if List[i] = NewList[j] then
                                begin
                                Find := 1;
                                end;
                                if List[i] <> NewList[j] then
                                begin
                                Find := 0;
                                end;
                        end;
                       
                end;
                if Find = 0 then
                begin
                NewList.Add(List[i]);
                end;

        end;
        NewList.Sort;

     
end;
Avatar billede jba750 Nybegynder
20. januar 2003 - 21:22 #1
Hvad kommer der ud når du kører den?
Avatar billede hermandsen Juniormester
20. januar 2003 - 21:50 #2
Ide:

function Hest(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := StrToInt(List.Strings[Index1]) - StrToInt(List.Strings[Index2]);
end;

procedure Pony(List: TStringList);
var
  NewList: TStringList;
  I: Integer;
begin
  NewList := TStringList.Create;
  for I := 0 to List.Count -1 do
    NewList.Add(List.Strings[I]);

  NewList.CustomSort(Hest);
  NewList.SaveToFile(ExtractFilePath(Application.ExeName) + 'hest.txt');
  NewList.Free;
end;

//hermandsen
Avatar billede mysitesolution Nybegynder
20. januar 2003 - 22:00 #3
hermandsen:
der må ikke være to af de samme
Avatar billede hermandsen Juniormester
20. januar 2003 - 22:09 #4
procedure Pony(List: TStringList);
var
  NewList: TStringList;
  I: Integer;
begin
  NewList := TStringList.Create;
  NewList.Duplicates := dupIgnore;

  for I := 0 to List.Count -1 do
(* og så kender du selv resten *)
Avatar billede hermandsen Juniormester
20. januar 2003 - 22:11 #5
Arh, fik ikke lige læst hele hjælpen i gennem...
"Note: Duplicates does nothing if the list is not sorted."

5 min...
Avatar billede hermandsen Juniormester
20. januar 2003 - 22:14 #6
begin
  NewList := TStringList.Create;
  NewList.Sorted := True;
  NewList.Duplicates := dupIgnore;
//...

Det vurde vist kunne gøre det...

Vil lige sige at intet af koden er testet, såååh... ;)
Avatar billede mysitesolution Nybegynder
20. januar 2003 - 22:23 #7
virker ikke med det her
Avatar billede hermandsen Juniormester
20. januar 2003 - 22:32 #8
Nå, så tager vi den besværlige måde...

procedure Pony(List: TStringList);
var
  NewList: TStringList;
  I: Integer;
  Last: String;
begin
  NewList := TStringList.Create;
  for I := 0 to List.Count -1 do
    if NewList.IndexOf(List.Strings[I]) <> -1 then
      NewList.Add(List.Strings[I]);

  NewList.CustomSort(Hest);
  NewList.SaveToFile(ExtractFilePath(Application.ExeName) + 'hest.txt');
  NewList.Free;
end;

//hermandsen
Avatar billede hermandsen Juniormester
20. januar 2003 - 23:14 #9
Hmmm... Okay, det er sent!

procedure Pony(List: TStringList);
var
  NewList: TStringList;
  I: Integer;
  Last: String;
begin
  NewList := TStringList.Create;
  for I := 0 to List.Count -1 do
    if NewList.IndexOf(List.Strings[I]) = -1 then //en mindre fejlberegning
      NewList.Add(List.Strings[I]);

  NewList.CustomSort(Hest);
  NewList.SaveToFile(ExtractFilePath(Application.ExeName) + 'hest.txt');
  NewList.Free;
end;
Avatar billede borrisholt Novice
21. januar 2003 - 08:15 #10
Så lige for the Record, også lidt ofr at blande mig ...

Så er StrToInt ikke ret hurtig, fornu at sige det pænt ... Hvis du ar mange integers burde du orveje en T(Heste?)List i stedet for. Der arbejder du udelukkende med Pointere, og skal ikke flytte memory hvergang du skal læse og skrive ...

Ydligere vil jeg lige her supplere med en funktion der kan sammenligne 2 integers på sammemåde som CompareStr :

function CompareInt(a, b: Integer): Integer; assembler;
{
  The return value is
  -1 if a is less than b,
  0 if a equals b
  1 if a is greater than b.
}
asm
    xor ecx, ecx
    cmp edx, eax
    je @CompareIntDONE
    jg @GreaterThan
    dec ecx
    jmp @CompareIntDONE
  @GreaterThan:
    inc ecx
  @CompareIntDONE:
    mov eax, ecx
end;

Det kunne nu være sjovt at se hvem der hurtigst kunne sortere 1 mia integers ...

Jens B
Avatar billede hermandsen Juniormester
21. januar 2003 - 08:50 #11
>>Jens
Jeg tror din hest vinder det væddeløb! ;)
Avatar billede hermandsen Juniormester
21. januar 2003 - 09:21 #12
>>mysitesolution
Borrisholt har ret i at det er laaangt hurtigere med en int-list...

private
  aInt: array of Integer;

procedure Load(FileName: String);
var
  F: File;
  Count, I: Integer;
begin
  if not FileExists(FileName) then Exit;
  try
    AssignFile(F, FileName);
    FileMode := fmOpenRead;
    Reset(F, 1);
    Dummy := -1;
    Read(F, Count);
    SetLength(aInt, Count + 1);
    for I := 0 to Count -1 do
      Read(F, aInt[I]);
  finally
    CloseFile(F);
  end;
end;

procedure Save(FileName: String);
var
  F: File;
  Count, I: Integer;
begin
  try
    AssignFile(F, FileName);
    Rewrite(F, 1);
    Count := High(aInt) + 1;
    Write(F, Count);
    for I := 0 to Count -1 do
      Write(F, aInt[I]);
  finally
    CloseFile(F);
  end;
end;

//hermandsen
Avatar billede hermandsen Juniormester
21. januar 2003 - 09:23 #13
Hmmm...
File-variablen F, bør nok være File of Integer;

altså

var
  F: File of Integer;

//hermandsen
Avatar billede borrisholt Novice
21. januar 2003 - 09:42 #14
Selvfølgelig har jeg det !!!

Det har jeg altid !

:-)

Jens B
Avatar billede mysitesolution Nybegynder
21. januar 2003 - 19:10 #15
borris...

hvor dan skal jeg sætte det her op til at køre med din funktion?

procedure Pony(List: TStringList);
var
  NewList: TStringList;
  I: Integer;
  Last: String;
begin
  NewList := TStringList.Create;
  for I := 0 to List.Count -1 do
    if NewList.IndexOf(List.Strings[I]) = -1 then //en mindre fejlberegning
      NewList.Add(List.Strings[I]);

  NewList.CustomSort(Hest);
  NewList.SaveToFile(ExtractFilePath(Application.ExeName) + 'hest.txt');
  NewList.Free;
Avatar billede hermandsen Juniormester
21. januar 2003 - 22:33 #16
Du skal slet ikke bruge en TStringList... Du skal bruge file of Integer, hvis det skal gøres ordentligt!
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