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