Thread overview
Hash Compare
Apr 18, 2007
Johnny
Apr 18, 2007
BCS
Apr 18, 2007
Johnny
Apr 18, 2007
BCS
Apr 18, 2007
Johnny
Apr 18, 2007
BCS
Apr 18, 2007
Derek Parnell
April 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.

April 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)
}
April 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
April 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.
April 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 ?

April 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
April 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