Using array.sort

Chris Nicholson-Sauls ibisbasenji at gmail.com
Thu Jan 25 21:23:09 PST 2007


Heinz wrote:
> Chris Nicholson-Sauls Wrote:
> 
>> Heinz wrote:
>>> 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
>> Return any value less than 0 for "less than", 0 for "equal to", and any value greater than 
>> zero for "greater than".  (Most people default to -1,0,1.)  For a char[] you'd have to 
>> decide how you want to order characters... but one generic means is just to compare their 
>> character codes.  So something like:
>>
>> class myclass {
>>    char[] cs;
>>
>>    int opCmp (Object obj) {
>>      char oc ;
>>
>>      if (auto other = cast(myclass) obj) {
>>        foreach (i, c; cs) {
>>          oc = other.cs[i];
>>          if (c < oc) {
>>            return -1;
>>          }
>>          else if (c > oc) {
>>            return 1;
>>          }
>>        }
>>        return 0;
>>      }
>>      else {
>>        throw new Exception("Can only compare myclass with myclass.");
>>      }
>>    }
>> }
>>
>> -- Chris Nicholson-Sauls
> 
> 
> Thanks chris, i finally understood. This example is much clearer than the other one.
> We could also use in this case std.string.icmp(), as it returns the same values.
> 
> Thanks man, good luck.

You know, I always forget about that function because I use it and its sort only rarely in 
my own code.  That's most likely the way you want to go.

-- Chris Nicholson-Sauls


More information about the Digitalmars-d-learn mailing list