| Thread overview |
|---|
August 05, 2005 Array.sort understanding need | ||||
|---|---|---|---|---|
| ||||
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é
| ||||
August 05, 2005 Re: Array.sort understanding need | ||||
|---|---|---|---|---|
| ||||
Posted in reply to jicman | 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.
| |||
August 05, 2005 Re: Array.sort understanding need | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Vathix | Vathix says... > >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. 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é | |||
August 05, 2005 Re: Array.sort understanding need | ||||
|---|---|---|---|---|
| ||||
Posted in reply to jicman | 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;
}
| |||
August 05, 2005 Re: Array.sort understanding need | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Vathix |
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é
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply