Thread overview
Q: sort array of objects
Jan 11, 2004
Ant
Re: sort array of objects
Jan 11, 2004
Vathix
Jan 11, 2004
Ant
Jan 11, 2004
Vathix
Jan 11, 2004
Ant
January 11, 2004
Is array sort suppose to work for an
array of object?
the prog included outputs:

foreach sort b
foreach sort a
foreach sort z
for sort b
for sort a
for sort z

the wc.d example works for
int[char[]] dictionary;
... dictionary.keys.sort ...

Ant

##################################

import std.string;

class S
{
	char[] name;
	this(char[] name)
	{
		this.name = name;
	}

	int cmp(S s)
	{
		// this is never executed
		printf("std.string.cmp(%.*s, %.*s) = %d\n",
			name, s.name,
			std.string.cmp(name, s.name)
			);
		return std.string.cmp(name, s.name);
	}
}

void main()
{
	S[] as;
	as ~= new S("z");
	as ~= new S("a");
	as ~= new S("b");

	// I thought this would work...
	foreach(S s ; as.sort)
	{
		printf("foreach sort %.*s\n",s.name);
	}

	// or at least this...
	S[] bs = as.dup.sort;
	for ( int i = 0 ; i<bs.length; i++)
	{
		printf("for sort %.*s\n",bs[i].name);
	}
}

January 11, 2004
"Ant" <duitoolkit@yahoo.ca> wrote in message news:pan.2004.01.11.06.35.37.56028@yahoo.ca...
> Is array sort suppose to work for an
> array of object?
...
> int cmp(S s)
...


The function is now opCmp.



January 11, 2004
On Sun, 11 Jan 2004 06:35:51 -0500, Vathix wrote:

> "Ant" <duitoolkit@yahoo.ca> wrote in message news:pan.2004.01.11.06.35.37.56028@yahoo.ca...
>> Is array sort suppose to work for an
>> array of object?
> ...
>> int cmp(S s)
> ...
> 
> 
> The function is now opCmp.

Thank you.
(I beg your forgiveness. I simple look
into object.d would have shown it)

now int opCmp(S s)

still doesn't work

I have to do:

int opCmp(Object s)
{
	return std.string.cmp(name, (cast(S)s).name);
}


doesn't seem right.

Ant

January 11, 2004
> int opCmp(Object s)
> {
> return std.string.cmp(name, (cast(S)s).name);
> }
>
>
> doesn't seem right.
>
> Ant
>


What I do is make two:

int opCmp(RealObject ro)
{
    return comparison;
}

override int opCmp(Object o)
{
    RealObject ro = cast(RealObject)o;
    if(!ro) // not correct type
        return -1;
    return opCmp(ro); // normal comparison
}

Plus two for opEquals...
Not sure if this is a good way.



January 11, 2004
On Sun, 11 Jan 2004 10:46:00 -0500, Vathix wrote:

>> int opCmp(Object s)
>> {
>> return std.string.cmp(name, (cast(S)s).name);
>> }
>>
>>
>> doesn't seem right.
>>
>> Ant
>>

hmmm.... maybe it is right...
(I'll get breakfast before continuing posting)

> 
> 
> What I do is make two:
> 
> int opCmp(RealObject ro)
> {
>     return comparison;
> }
> 
> override int opCmp(Object o)
> {
>     RealObject ro = cast(RealObject)o;
>     if(!ro) // not correct type
>         return -1;
>     return opCmp(ro); // normal comparison
> }
> 
> Plus two for opEquals...
> Not sure if this is a good way.

I guess that's the way to do it.

Ant