procedure TForm1.Button1Click(Sender: TObject); var i, tempint : integer; bubble : boolean;
begin repeat begin bubble := false; for I := 1 to listbox1.GetCount do if listbox1.Items[i] > listbox1.Items[i+1] then begin tempint := strtoint(listbox1.Items[i]); listbox1.Items[i] := listbox1.Items[i+1]; listbox1.Items[i+1] := inttostr(tempint); bubble := true; end;
end
until bubble = false;
end;
Værdierne i listboxen er af integer. Jeg får fejlen list index out of bounds.
Prøv lige at sammenlign de to stykker kode. Jeg vil skråsikkert påstå min version er den pæneste og den letteste at gennemse.
procedure TForm1.Button1Click(Sender: TObject); var bubble: boolean; i, tempint: integer; begin repeat bubble := false; for i := 1 to listbox1.Items.Count do if listbox1.Items[i] > listbox1.Items[i+1] then begin tempint := strtoint(listbox1.Items[i]); listbox1.Items[i] := listbox1.Items[i+1]; listbox1.Items[i+1] := inttostr(tempint); bubble := true; end; end until not bubble; end;
.. prøv at holde din kode pæn.
Er det en øvelse udi BubbleSort eller ved du ikke at man kan sortere listerne helt automatisk? Både med en bogstavbaseret (sorterer 1,10,11,2,3,4 osv) eller en hjemmestrikket som er meget hurtigere end BubbleSort.
Manglede lige lidt før det kunne oversættes - men en bubblesort synes jeg ikke det ligner endnu:
procedure TForm1.Button1Click(Sender: TObject); var Bubble: boolean; i, tempint: integer; begin repeat for i := 0 to listbox1.Items.Count - 2 do begin Bubble := listbox1.Items[i] > listbox1.Items[i+1]; if Bubble then begin tempint := StrToInt(listbox1.Items[i]); listbox1.Items[i] := listbox1.Items[i+1]; listbox1.Items[i+1] := IntToStr(tempint); end; end; until not bubble; end;
procedure TForm37.btnGenererClick(Sender: TObject); var I, J: Integer; begin ListBox1.Items.BeginUpdate; ListBox1.Items.Clear; J := Random(500);
for I := 1 to J do ListBox1.Items.Add(IntToStr(Random(50000)));
ListBox1.Items.EndUpdate; end;
procedure TForm37.FormCreate(Sender: TObject); begin Randomize; end;
procedure TForm37.QuickSort(L, R: Integer; List: TStrings; SCompare: TStringsSortCompare); var I, J, P: Integer; begin repeat I := L; J := R; P := (L + R) shr 1; repeat while SCompare(List, I, P) < 0 do Inc(I);
while SCompare(List, J, P) > 0 do Dec(J);
if I <= J then begin List.Exchange(I, J);
if P = I then P := J else if P = J then P := I;
Inc(I); Dec(J); end; until I > J;
if L < J then QuickSort(L, J, List, SCompare);
L := I; until I >= R; end;
function TForm37.StringsSortCompare(List: TStrings; Index1, Index2: Integer): Integer; var A, B: Extended; S1, S2: string; begin S1 := List[Index1]; S2 := List[Index2]; if TryStrToFloat(S1, A) and TryStrToFloat(S2, B) then Result := CompareValue(A, B) else Result := StrComp(pChar(S1), pChar(s2)); end;
Hvis du bruger Delphi 2007/2009 kan det laves vha en Class helper :
unit TStringsHelperU;
interface
uses Classes;
type TStringsHelper = class helper for TStrings strict private procedure QuickSort(L, R: Integer); function SortCompare(Index1, Index2: Integer): Integer; public function Add(const V: Variant): Integer; overload; function Add(const Args: array of Variant): Integer; overload; procedure Sort; end;
implementation
uses Math, Variants, Sysutils;
function TStringsHelper.Add(const Args: array of variant): Integer; var Tmp: string; I: Integer; begin Tmp := '';
for I := Low(Args) to High(Args) do Tmp := Tmp + VarToStr(Args[i]) ;
Result := Add(Tmp) ; end;
procedure TStringsHelper.QuickSort(L, R: Integer); var I, J, P: Integer; begin repeat I := L; J := R; P := (L + R) shr 1; repeat while SortCompare(I, P) < 0 do Inc(I);
while SortCompare(J, P) > 0 do Dec(J);
if I <= J then begin Exchange(I, J);
if P = I then P := J else if P = J then P := I;
Inc(I); Dec(J); end; until I > J;
if L < J then QuickSort(L, J);
L := I; until I >= R; end;
procedure TStringsHelper.Sort; begin BeginUpdate; QuickSort(0, Count - 1); EndUpdate; end;
function TStringsHelper.SortCompare(Index1, Index2: Integer): Integer; var A, B: Extended; S1, S2: string; begin S1 := Get(Index1); S2 := Get(Index2);
if TryStrToFloat(S1, A) and TryStrToFloat(S2, B) then Result := CompareValue(A, B) else Result := StrComp(pChar(S1), pChar(s2)); end;
function TStringsHelper.Add(const V: Variant): Integer; begin Result := Add([V]) ; end;
borrisholt: Du kan vist godt lide "Class Helpers" (M.Cantu mener ikke de er relevante i andet end .NET - men jeg ved slet ikke hvordan jeg skal bruge dem. Håber at kunne lure det af i ViewOnly. Synes i øvrigt det flimrer lidt. Er der en timer der opdaterer?)
Hvad med denne løsning?
uses Math;
function CompareAsInteger(aList: TStringList; aIndex1, aIndex2: integer): integer; begin result := CompareValue(StrToIntDef(aList[aIndex1],0),StrToIntDef(aList[aIndex2],0)); end;
procedure TfrmMain.btnSortClick(Sender: TObject); var StringList: TStringList; begin lbData.Items.BeginUpdate; StringList := TStringList.Create; try // Bliver nødt til at kopiere til TStringList for at få adgang til CustomSort StringList.Assign(lbData.Items); StringList.CustomSort(CompareAsInteger); // men så skal data jo også lige tilbage igen. lbData.Items.Assign(StringList); finally StringList.Free; lbData.Items.EndUpdate; end; end;
with ListBox1.Items do begin Add('delphi.about.com') ; Add(2008) ; Add(true) ; Add(['Only ', 1, true, ' line']) ; end;
Du er mit ViewOnly eksempel filmmere lidt er timeren, det har ikke noget at gøre med. HRC hvor bor du hende i landet, ind til flere mennesker har spurgt min om jeg ville holde et kursus i nye ting i Delphi. Jeg har lagt mærke til mannge Delphi programmører står stille ved Delphi 7, altså mht. udnyttelse af sproget. (dig inklusive)
Hvis man kunne samle nogle mennesker, ville jeg da nok kunne overtales.
Jeg ved nu ikke om jeg sidder fast i D7', men det er rigtigt jeg ikke springer på "Interfaces", "Class helpers" eller andet, før jeg kan se en reel gevinst kontra besværet ved at bruge det. Ved godt at ovennævnte to punkter har flere år/versioner på bagen, men hvad andet er der egentlig?
Bor i Odense i øvrigt, men et kursus er ikke uinteressant. Det bør starte på højt niveau; et rigtigt nørdkursus.
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.