digitalmars.D.learn - Hash Compare
- Johnny <bierbauch jenz.info> Apr 18 2007
- BCS <BCS pathlink.com> Apr 18 2007
- Johnny <bierbauch jenz.info> Apr 18 2007
- BCS <BCS pathlink.com> Apr 18 2007
- Johnny <bierbauch jenz.info> Apr 18 2007
- BCS <BCS pathlink.com> Apr 18 2007
- Derek Parnell <derek psych.ward> Apr 18 2007
Hello,
I've got a problem. I need to check if a hash key exists in a for loop like:
int [char[]] a;
int [char[]] b;
a = { a => 1; b => 5; c=> 8 }
b = { a => 5; b => 4; d => 3; f => 4 }
foreach (m; a.keys) {
if ( b[m] ) {
writefln("%s %s %s", m, a[m], b[m])
}
else {
writefln("%s %s", m, a[m])
}
}
... not "real" D but I hope you understand the code and what it should do.
Thanks.
Apr 18 2007
Johnny wrote:Hello, I've got a problem. I need to check if a hash key exists in a for loop like: int [char[]] a; int [char[]] b; a = { a => 1; b => 5; c=> 8 } b = { a => 5; b => 4; d => 3; f => 4 } foreach (m; a.keys) { if ( b[m] ) { writefln("%s %s %s", m, a[m], b[m]) } else { writefln("%s %s", m, a[m]) } } ... not "real" D but I hope you understand the code and what it should do. Thanks.
What is the issue? That's about as good as anything I can think of. You might try this (but it's not much better) foreach (k, v1; a) { if ( auto v2 = k in b ) // is this what your looking for? writefln("%s %s %s", k, v1, *v2) else writefln("%s %s", k, v1) }
Apr 18 2007
BCS Wrote:Johnny wrote:Hello, I've got a problem. I need to check if a hash key exists in a for loop like: int [char[]] a; int [char[]] b; a = { a => 1; b => 5; c=> 8 } b = { a => 5; b => 4; d => 3; f => 4 } foreach (m; a.keys) { if ( b[m] ) { writefln("%s %s %s", m, a[m], b[m]) } else { writefln("%s %s", m, a[m]) } } ... not "real" D but I hope you understand the code and what it should do. Thanks.
What is the issue? That's about as good as anything I can think of. You might try this (but it's not much better) foreach (k, v1; a) { if ( auto v2 = k in b ) // is this what your looking for? writefln("%s %s %s", k, v1, *v2) else writefln("%s %s", k, v1) }
A good hint. my problem is that I get an ArrayBounds error if i try it with my method. ... an I can't catch it
Apr 18 2007
Johnny wrote:BCS Wrote:Johnny wrote:foreach (m; a.keys) { if ( b[m] ) { writefln("%s %s %s", m, a[m], b[m]) } else { writefln("%s %s", m, a[m]) } }
foreach (k, v1; a) { if ( auto v2 = k in b ) // is this what your looking for? writefln("%s %s %s", k, v1, *v2) else writefln("%s %s", k, v1) }
A good hint. my problem is that I get an ArrayBounds error if i try it with my method. ... an I can't catch it
The "/a/ in /b/" construct fixes that. Just looking up the value should do what you described if the value isn't their.
Apr 18 2007
BCS Wrote:Johnny wrote:BCS Wrote:Johnny wrote:
foreach (m; a.keys) { if ( b[m] ) { writefln("%s %s %s", m, a[m], b[m]) } else { writefln("%s %s", m, a[m]) } }
foreach (k, v1; a) { if ( auto v2 = k in b ) // is this what your looking for? writefln("%s %s %s", k, v1, *v2) else writefln("%s %s", k, v1) }
A good hint. my problem is that I get an ArrayBounds error if i try it with my method. ... an I can't catch it
The "/a/ in /b/" construct fixes that. Just looking up the value should do what you described if the value isn't their.
I've tested it, and yes thank you very much it works fine! .. but still don't really understand what "auto v2 = m in b" means something like v2 = b.keys ?
Apr 18 2007
Johnny wrote:BCS Wrote:Johnny wrote:BCS Wrote:Johnny wrote:
foreach (m; a.keys) { if ( b[m] ) { writefln("%s %s %s", m, a[m], b[m]) } else { writefln("%s %s", m, a[m]) } }
foreach (k, v1; a) { if ( auto v2 = k in b ) // is this what your looking for? writefln("%s %s %s", k, v1, *v2) else writefln("%s %s", k, v1) }
A good hint. my problem is that I get an ArrayBounds error if i try it with my method. ... an I can't catch it
The "/a/ in /b/" construct fixes that. Just looking up the value should do what you described if the value isn't their.
I've tested it, and yes thank you very much it works fine! .. but still don't really understand what "auto v2 = m in b" means something like v2 = b.keys ?
actualy its about three cool features in one line here is the slightly expanded vertion foreach (k, v1; a) { int* v2 = k in b; // return a pointer to the value assigned to key k in b if (v2 !is null ) // if pointer is not null (key exists) writefln("%s %s %s", k, v1, *v2) else // if pointer is null (key dosn't exist) writefln("%s %s", k, v1) } the vertion I used uses type inference to avoid needing to know the type and also uses the "declare and check a variable" feature. http://www.digitalmars.com/d/expression.html#InExpression http://www.digitalmars.com/d/statement.html#IfStatement look for IfCondition and Declarator
Apr 18 2007
On Wed, 18 Apr 2007 12:13:39 -0400, Johnny wrote:Hello, I've got a problem. I need to check if a hash key exists in a for loop like: int [char[]] a; int [char[]] b; a = { a => 1; b => 5; c=> 8 } b = { a => 5; b => 4; d => 3; f => 4 } foreach (m; a.keys) { if ( b[m] ) { writefln("%s %s %s", m, a[m], b[m]) } else { writefln("%s %s", m, a[m]) } } ... not "real" D but I hope you understand the code and what it should do. Thanks.
Try replacing "if (b[m])" with "if (m in b)". The correct way to find out if a specific key exists in an AA is to use the "in" syntax. -- Derek Parnell Melbourne, Australia "Justice for David Hicks!" skype: derek.j.parnell
Apr 18 2007









BCS <BCS pathlink.com> 