[fpc-devel] Stringlist customsort

Franz Müller office at focusdata.at
Fri Nov 30 13:53:18 CET 2018


> Hi everybody!
>
> Currently, the implementation of cutomsorted stringlists ist very far 
> from satisfactory; you have to call the sort routine again whenever a 
> string is added to the stringlist or an item is changed, because the 
> stringlist cannot keep itself automatically sorted using a custom 
> compare function. There is a better implemetation using the 
> "experimental" define FPC_TESTGENERICS, but this code has not become 
> "mainstream" FPC for a long time now, and I feel that the use of 
> generics for the implementation of stringlists will also introduce 
> quite some unnecessary overhead.

The reason for not using the generic based version is that the generics 
code is slower.

That is what I meant with unnecessary overhead


> I would like to propose one of two versions of improvement of the 
> non-FPC_TESTGENERICS TStringlist, that I would also be willing to 
> program and to submit a patch for it.
>
> Variation one:
>
> Just add a property OnSort of type TListSortCompare and always sort 
> using the user-provided function if the property is not nil. Automatic 
> sorting would only occur if sortstyle=sslauto, while the behaviour for 
> sortstyle=ssluser would remain as before for backward compatibility.

I don't see the value of this proposal.

It would allow stringlists with a non standard sort order (for example 
numeric sort instead of alphanumeric) to remain automatically sorted 
when items are added or changed. But I also feel the second variation is 
better.

> Variation two, more flexible:
>
> Add a property OnSort of type TStringListSortCompare, which would 
> allow stringlists to be sorted not only by the value of the string, 
> but also by the value of the fields of the associated object. In that 
> case it would be necessary to add a new sortstyle sslobject, which 
> would have to be used when OnSort uses fields from the object for 
> comparing, as in this case the find method cannot use binary search 
> for locating an item, just like for unsorted stringlists (and the 
> stringlist wouldn't know otherwise that it can't use binary search).

I can understand an extension where you want to be able to sort on the 
value
of an associated object. But as you point out, the Find or IndexOf will 
then
become useless.

Useless? Why? Slower - yes. Don't matter with stringlists of a few dozen 
up to a few hundred  items. If you have more data, maybe you need a 
specialized class.


So the question then becomes whether you would not be better off with 
another class altogether if you want such customized behaviour.

 From what you describe, I think you should not be using TStrings (Or 
TStringList) at all. TStrings is a very general-purpose class for use in 
a GUI, which IMHO should not be burdened with additional highly 
specialized mechanisms.

Take a simple example: Suppose you have a drop down box and want to keep 
the 5 most recently used items in front, and all the other items sorted 
alphabetically. With a custom sort which is not restricted to the string 
values for sorting, you could do this easily by placing an additional 
value for sorting in the object field. As the drop down box uses 
TStrings, you are bound to use something like a stringlist.


Do not forget that TStringlist is just a possible implementation of
TStrings. You are free to create your own. For example, the inifiles 
unit has a
specialized version which is optimized for containing name=value pairs.

Of course, everyone can create his own basic classes for everything, but 
I think that is not how high level programming is supposed to work. The 
improvement that I propose is 100% compatible with current code, if you 
don' t need the feature (which will be the case most of the time), you 
just don't use it, but if you need this added flexibility, it is there. 
The implementation is very simple and no complexity is added for 
programmers who don't need the feature.


Franz

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20181130/764db799/attachment.html>


More information about the fpc-devel mailing list