Thread overview |
---|
April 18, 2007 Hash Compare | ||||
---|---|---|---|---|
| ||||
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. |
April 18, 2007 Re: Hash Compare | ||||
---|---|---|---|---|
| ||||
Posted in reply to Johnny | 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)
}
|
April 18, 2007 Re: Hash Compare | ||||
---|---|---|---|---|
| ||||
Posted in reply to BCS | 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
|
April 18, 2007 Re: Hash Compare | ||||
---|---|---|---|---|
| ||||
Posted in reply to Johnny | 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. |
April 18, 2007 Re: Hash Compare | ||||
---|---|---|---|---|
| ||||
Posted in reply to BCS | 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 ?
|
April 18, 2007 Re: Hash Compare | ||||
---|---|---|---|---|
| ||||
Posted in reply to Johnny | 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 |
April 18, 2007 Re: Hash Compare | ||||
---|---|---|---|---|
| ||||
Posted in reply to Johnny | 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 |
Copyright © 1999-2021 by the D Language Foundation