20. januar 2003 - 21:16Der 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;
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]);
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]);
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]);
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 ...
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]);
Du skal slet ikke bruge en TStringList... Du skal bruge file of Integer, hvis det skal gøres ordentligt!
Synes godt om
Ny brugerNybegynder
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.