digitalmars.D.learn - Array.sort understanding need
- jicman (60/60) Aug 05 2005 Greetings!
Greetings! Imagine this code, |import std.string; |import std.stdio; |class DAEError |{ | char[] name = ""; | int Count = 0; |} | |void main() |{ | DAEError Err[]; | Err.length = Err.length + 1; | Err[Err.length - 1] = new DAEError(); | Err[Err.length - 1].name = "A"; | Err[Err.length - 1].Count++; | Err.length = Err.length + 1; | Err[Err.length - 1] = new DAEError(); | Err[Err.length - 1].name = "B"; | Err[Err.length - 1].Count++; | Err.length = Err.length + 1; | Err[Err.length - 1] = new DAEError(); | Err[Err.length - 1].name = "C"; | Err[Err.length - 1].Count++; | Err.length = Err.length + 1; | Err[Err.length - 1] = new DAEError(); | Err[Err.length - 1].name = "D"; | Err[Err.length - 1].Count++; | Err.length = Err.length + 1; | Err[Err.length - 1] = new DAEError(); | Err[Err.length - 1].name = "a"; | Err[Err.length - 1].Count++; | Err.length = Err.length + 1; | Err[Err.length - 1] = new DAEError(); | Err[Err.length - 1].name = "b"; | Err[Err.length - 1].Count++; | Err.length = Err.length + 1; | Err[Err.length - 1] = new DAEError(); | Err[Err.length - 1].name = "c"; | Err[Err.length - 1].Count++; | Err = Err.sort; | foreach (int error, DAEError e; Err) | writefln(Err[error].name, " ", toString(Err[error].Count)); |} If I compile this code and run it, I get, jic 11:01:19-> ./sort c 1 b 1 a 1 D 1 C 1 B 1 A 1 This is not what I expected at all. But, I must say that the sort function does work great with char[][] arrays. But, on this one, I would expect to have .name and then, .Count be the sorting keys, in that order. Am I crazy or just don't understand sort? thanks, josé
Aug 05 2005
On Fri, 05 Aug 2005 11:11:13 -0400, jicman <jicman_member pathlink.com> wrote:Greetings! Imagine this code, |import std.string; |import std.stdio; |class DAEError |{ | char[] name = ""; | int Count = 0; |}Add opCmp() and opEquals() to the class and tell it how to sort.
Aug 05 2005
Vathix says...On Fri, 05 Aug 2005 11:11:13 -0400, jicman <jicman_member pathlink.com> wrote:Thanks. However, I have been looking at this page, http://www.digitalmars.com/d/operatoroverloading.html and pardon my D ignorance and/or c, but I have never used OpCmp() nor opEquals(). I have gone into the web and search for "sorting array opCmp() opEquals()" and found a few pages, but none really shows any examples. Will anyone be willing to point me to an example that uses what Vathix has suggested? Thanks again. joséGreetings! Imagine this code, |import std.string; |import std.stdio; |class DAEError |{ | char[] name = ""; | int Count = 0; |}Add opCmp() and opEquals() to the class and tell it how to sort.
Aug 05 2005
import std.stdio, std.string; class Foo { char[] str; int num; this(char[] str, int num) { this.str = str; this.num = num; } override char[] toString() { return format("'%s' %d", str, num); } override int opCmp(Object obj) // Override from Object. { Foo f; f = cast(Foo)obj; if(f) return opCmp(f); // Use opCmp(Foo). assert(0); // Wrong type. } int opCmp(Foo f) { int result; result = std.string.cmp(str, f.str); if(!result) // If match, compare num`s. result = num - f.num; return result; } override int opEquals(Object obj) // Override from Object. { Foo f; f = cast(Foo)obj; if(f) return opEquals(f); // Use opEquals(Foo). assert(0); // Wrong type. } int opEquals(Foo f) { int result; result = str != f.str; if(!result) // If match, compare num`s. result = num - f.num; return result; } } int main() { Foo[8] fs; fs[0] = new Foo("foo", 3); fs[1] = new Foo("foo", 1); fs[2] = new Foo("candy", 4); fs[3] = new Foo("foo", 5); fs[4] = new Foo("gum", 5); fs[5] = new Foo("zoo", 9); fs[6] = new Foo("bar", 9); fs[7] = new Foo("fun", 88); fs.sort; foreach(Foo f; fs) { writefln("%s", f.toString()); } return 0; }
Aug 05 2005
Vathix says...import std.stdio, std.string; class Foo { char[] str; int num; this(char[] str, int num) { this.str = str; this.num = num; } override char[] toString() { return format("'%s' %d", str, num); } override int opCmp(Object obj) // Override from Object. { Foo f; f = cast(Foo)obj; if(f) return opCmp(f); // Use opCmp(Foo). assert(0); // Wrong type. } int opCmp(Foo f) { int result; result = std.string.cmp(str, f.str); if(!result) // If match, compare num`s. result = num - f.num; return result; } override int opEquals(Object obj) // Override from Object. { Foo f; f = cast(Foo)obj; if(f) return opEquals(f); // Use opEquals(Foo). assert(0); // Wrong type. } int opEquals(Foo f) { int result; result = str != f.str; if(!result) // If match, compare num`s. result = num - f.num; return result; } } int main() { Foo[8] fs; fs[0] = new Foo("foo", 3); fs[1] = new Foo("foo", 1); fs[2] = new Foo("candy", 4); fs[3] = new Foo("foo", 5); fs[4] = new Foo("gum", 5); fs[5] = new Foo("zoo", 9); fs[6] = new Foo("bar", 9); fs[7] = new Foo("fun", 88); fs.sort; foreach(Foo f; fs) { writefln("%s", f.toString()); } return 0; }Any questions? :-) Thank you. I appreciate it very much. Never done this, so this example is perfect. josé
Aug 05 2005