D - Q: sort array of objects
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); } }
Jan 10 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.
Jan 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...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. AntIs array sort suppose to work for an array of object?...int cmp(S s)... The function is now opCmp.
Jan 11 2004
int opCmp(Object s) { return std.string.cmp(name, (cast(S)s).name); } doesn't seem right. AntWhat 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.
Jan 11 2004
On Sun, 11 Jan 2004 10:46:00 -0500, Vathix wrote:hmmm.... maybe it is right... (I'll get breakfast before continuing posting)int opCmp(Object s) { return std.string.cmp(name, (cast(S)s).name); } doesn't seem right. AntWhat 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
Jan 11 2004