Using array.sort
Heinz
billgates at microsoft.com
Wed Jan 24 19:55:57 PST 2007
Chris Nicholson-Sauls Wrote:
> Heinz wrote:
> > Carlos Santander Wrote:
> >
> >> Heinz escribió:
> >>> torhu Wrote:
> >>>
> >>>> Heinz wrote:
> >>>>> What does this sort property do? how can i use it? how do i implement opCmp. thanks in advance
> >>>> .sort sorts an array, using some default sort order. If you want to
> >>>> change the order, you implement opCmp.
> >>>>
> >>>>
> >>>> opCmp has got these signatures, think. It doesn't seem to be documented
> >>>> much:
> >>>>
> >>>> class C {
> >>>> // the argument is of type Object, not C
> >>>> int opCmp(Object other);
> >>>> }
> >>>>
> >>>> or:
> >>>>
> >>>> struct S {
> >>>> int opCmp(S other);
> >>>> }
> >>>>
> >>>>
> >>>> opCmp() has to return less than zero if it's own object is smaller, more
> >>>> than zero if 'other' is smaller, and zero if they are equal.
> >>>>
> >>>> You can't define opCmp for any other types, if you want to change the
> >>>> sort order of ints, you have to write a separate sort function.
> >>> So, lets assume we have the following class:
> >>>
> >>> class myclass
> >>> {
> >>> char[] cs;
> >>> }
> >>>
> >>> and then we have a dinamic array of myclass, can we sort this array by the cs property?
> >> Yes, you would have to write an opCmp that does that.
> >>
> >> --
> >> Carlos Santander Bernal
> >
> > Hi,
> >
> > Do i have to declare opCmp(Object) and it'll do it automatically? or
> > Do i have to write the algorithm to sort the classes by the cs property? if so, what's the sense of having a sort property if i have to implement a propietary function, it acts as a link.
>
> opCmp needs only return the sort-order of an object in relation to another given object.
> Using a simpler example:
>
> class Number {
> int i;
>
> int opCmp (Object obj) {
> if (auto other = cast(Number) obj) {
> return this.i - other.i;
> }
> else {
> throw new Exception("Can only compare Number with another Number.");
> }
> }
> }
>
> Otherwise the .sort property would have no idea how to order the objects (there really is
> no generic means to do this). IIRC, there is/was a default Object.opCmp which compared
> the address of objects, but this is really useless in terms of proper sorting. (Although
> it does have the usefulness of making all classes available as associative array keys.)
>
> -- Chris Nicholson-Sauls
Hi Chris, i still don't get it hahaha. Replace the int in your example by a char[] str; How the hell opCmp can compare a string, what value of type int should return? thx
More information about the Digitalmars-d-learn
mailing list