- 締切済み
D言語の連想配列
D言語の連想配列を使いたいのですが、うまくいきません。同じキーを違うキーだと判定しているようです。 class ではなくstructだとうまくいくようなのですが… class A { int[2] a; this(int p,int q) { a[0]=p; a[1]=q; } int toCmp(A *x) { if(this.a[0]<x.a[0])return -1; if(this.a[0]>x.a[0])return 1; if(this.a[1]<x.a[1])return -1; if(this.a[1]>x.a[1])return 1; return 0; } } int main(char[][] args) { int[A] x; x[new A(1,2)]=1; x[new A(1,2)]=2; foreach(A a,int i;x) { printf("(%d %d) %d\n",a.a[0],a.a[1],i); } return 0; } 実行結果 (1 2) 2 (1 2) 1
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
int opEquals(A x){ return (this.a[0]==x.a[0] && this.a[1]==x.a[1]); } なんて書いて試してみましたが ==を使って同一の検査をするわけではないようです。 多分オブジェクトのアドレスをハッシュに使うのでしょうね。 これは、区別して欲しい時があるし かならずしもおかしな動作とは言えないと思いますが、うまくやる方法があれば私も知りたいです。 試しに、オブジェクトを文字列表現にしたものを返して、文字列をキーにしてやる方法とか考えてみましたが 仮に A z; x[z.toString]=z; としたとしても x[z.toString].a[0] とかするんじゃ z.a[0] でいいもんね。 回答になってなくてすみません
お礼
オブジェクトのアドレスをハッシュに使うとありますがtoHashを定義してもだめでした。 うーんなぜでしょう。
補足
2ちゃんねるのD言語スレに質問して解決しました。 opCmp(Object)を実装するとよいみたいです。