and there are other available too.
Which and where?

In an old post, I wrote:

> I recently grepped the fpc source to find a stable sort, and instead I only found QuickSort implementations. > Seven of them! In TFPList.Sort, TStringList.QuickSort, TFPSList.QuickSort, TFPBaseDitherer.QuickSort, TFPMedianCutQuantizer.QuickSort, TFPMedianCutQuantizer.QuickSortBoxes and paslzxcomp.qsort
>Plus another one in the LCL in TCustomGrid.Sort.

I would also call that "completely inadequate", and in addition unnecessarily overcomplicated.

If all theses classes would use the same sorting function, you could just write a single comparison function,
for the languages you have...

Benito


On 12/01/2012 05:23 PM, Mattias Gaertner wrote:
On Sat, 1 Dec 2012 16:43:34 +0200
Avishai<[email protected]>  wrote:

Lazarus support for Sorting is completely inadequate.  You can not
sort a list of strings without knowing the language of the list.  This
should be a simple process. I would like to try to improve this, but I
will need some help from the Lazarus community.

It appears that each Control that has a List has its own separate Sort
routine and each is different.  I would think that there would be a
single Sort routine and could be called by each control.
I'm not sure if I can follow you here. Maybe this helps:

A string list can be sorted with a single line of code or you can
write your own compare function. The default sort algorithm is
quicksort and there are other available too.
So support for "Sorting" is good.

Maybe you are missing some "String compare functions"?

There are many basic compare functions in the RTL, FCL and LazUtils.
For instance CompareStr, CompareText, AnsiCompareText, UTF8CompareStr,
UTF8CompareText.
All these functions have their pros and cons.

Keep in mind that some human languages have multiple official compare
functions and it gets even more difficult when mixing languages
(unicode).


This could be a starting point that could be expanded to include other
Languages and Sort Methods, but it is only a suggestion.

{===== Sorting =====}

const
   SortAscending: Boolean = True;

function SortHebrew(List: TStringList; Index1, Index2: Integer):
Integer;  {Hebrew}
begin
   Result:= UTF8CompareStr(List[Index1],List[Index2]);
   if not SortAscending then
     Result:= -Result;
end;

function SortPortuguese(List: TStringList; Index1, Index2: Integer):
Integer;  {Portuguese}
begin
   Result:= WideCompareText(UTF8Decode(List[Index1]),UTF8Decode(List[Index2]));
   if not SortAscending then
     Result:= -Result;
end;

{===== Numeric Sort =====}

function DoNumSort(List: TStringList; Index1, Index2: Integer): Integer;
var
   N1, N2: Double;
begin
   N1:= StrToFloatDef(List[Index1],0);
   N2:= StrToFloatDef(List[Index2],0);
   if N1<  N2 then
     result := -1
   else if N1>  N2 then
     result := 1
   else
   result := 0;
   if not SortAscending then
     Result:= -Result;
end;

procedure SortNumeric(Items: TStrings);
var
   Alist: TStringList;
begin
   Alist:= TStringList.Create;
     with Items do begin
       Alist.CommaText:= CommaText;
       Alist.CustomSort(@DoNumSort);
       CommaText:= Alist.commaText;
     end;
   FreeAndNil(Alist);
end;

{ This is the User Sort main routine }
{ Example Call: SortStringList(Memo1.Lines, HebrewSort); }
{ Example Call: SortStringList(ListBox1.Items, HebrewSort); }
{ Example Call: SortStringList(ComboBox1.Items, HebrewSort); }

function SortStringList(AStringList: TStrings; SortStyle: Integer): Integer;
var
   SortList: TStringList;
begin
   SortList:= TStringList.Create;
     SortList.CaseSensitive:= True;
     SortList.Assign(AStringList);
        { Sort according to Language }
     case SortStyle of
       EnglishSort: SortList.Sort;
       HebrewSort: SortList.CustomSort(@SortHebrew);
       PortugueseSort: SortList.CustomSort(@SortPortuguese);
       NumericSort: SortList.CustomSort(@DoNumSort);
          { need input from Lazarus community for other Sort Methods }
     end;
     AStringList.Assign(SortList);
   FreeAndNil(SortList);
end;
Maybe you are searching for a unit with lots of string compare
functions?

Mattias


--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to