Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
April 15, 2006 Associative array mapping strings to strings | ||||
---|---|---|---|---|
| ||||
There was a post about this earlier, but I can't seem to find an answer. How do I create an associate array mapping strings to strings? I've tried: char[][char[]] strings; ---------------- alias char[] string; string[string] strings; Which are of course equivalent. Putting strings into the array is not a problem, however, when I try to retrieve elements I get the following compiler errors: (Code:) char[] headerNames = strings.keys; for (int i = 0; i < headerNames.length; i++) { writefln("%s: %s", headerNames[i], strings[headerNames[i]]); } (Errors:) TestApp.d:9: cannot implicitly convert expression (_aaKeys(strings,8)) of type char[][] to char[] TestApp.d:11: cannot implicitly convert expression (headerNames[i]) of type char to char[] This is gdc 0.17, based on dmd 0.14. I'm trying to compile the 0.18 alpha but it's failing (I'll post about that on the appropriate forum). Is there something wrong with the declaration? Is there a declaration that works? |
April 15, 2006 Re: Associative array mapping strings to strings | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrew Madigan | On Sat, 15 Apr 2006 12:41:45 +1000, Andrew Madigan <amadigan@gmail.com> wrote: > There was a post about this earlier, but I can't seem to find an answer. How > do I create an associate array mapping strings to strings? > > I've tried: > > char[][char[]] strings; > > ---------------- > > alias char[] string; > > string[string] strings; > > Which are of course equivalent. Putting strings into the array is not a > problem, however, when I try to retrieve elements I get the following > compiler errors: > > (Code:) > > char[] headerNames = strings.keys; > for (int i = 0; i < headerNames.length; i++) { > writefln("%s: %s", headerNames[i], strings[headerNames[i]]); > } > > (Errors:) > > TestApp.d:9: cannot implicitly convert expression (_aaKeys(strings,8)) of > type char[][] to char[] > TestApp.d:11: cannot implicitly convert expression (headerNames[i]) of type > char to char[] > > This is gdc 0.17, based on dmd 0.14. I'm trying to compile the 0.18 alpha > but it's failing (I'll post about that on the appropriate forum). Is there > something wrong with the declaration? Is there a declaration that works? The .keys in this case is a list of strings not a list of chars. So use this ... char[][] headerNames = strings.keys; for (int i = 0; i < headerNames.length; i++) { writefln("%s: %s", headerNames[i], strings[headerNames[i]]); } -- Derek Parnell Melbourne, Australia |
April 15, 2006 Re: Associative array mapping strings to strings | ||||
---|---|---|---|---|
| ||||
Posted in reply to Derek Parnell | Derek Parnell wrote:
> On Sat, 15 Apr 2006 12:41:45 +1000, Andrew Madigan <amadigan@gmail.com> wrote:
>
>> There was a post about this earlier, but I can't seem to find an answer.
>> How
>> do I create an associate array mapping strings to strings?
>>
>> I've tried:
>>
>> char[][char[]] strings;
>>
>> ----------------
>>
>> alias char[] string;
>>
>> string[string] strings;
>>
>> Which are of course equivalent. Putting strings into the array is not a problem, however, when I try to retrieve elements I get the following compiler errors:
>>
>> (Code:)
>>
>> char[] headerNames = strings.keys;
>> for (int i = 0; i < headerNames.length; i++) {
>> writefln("%s: %s", headerNames[i], strings[headerNames[i]]);
>> }
>>
>> (Errors:)
>>
>> TestApp.d:9: cannot implicitly convert expression (_aaKeys(strings,8)) of
>> type char[][] to char[]
>> TestApp.d:11: cannot implicitly convert expression (headerNames[i]) of
>> type
>> char to char[]
>>
>> This is gdc 0.17, based on dmd 0.14. I'm trying to compile the 0.18 alpha
>> but it's failing (I'll post about that on the appropriate forum). Is
>> there
>> something wrong with the declaration? Is there a declaration that works?
>
> The .keys in this case is a list of strings not a list of chars. So use this ...
>
> char[][] headerNames = strings.keys;
> for (int i = 0; i < headerNames.length; i++) {
> writefln("%s: %s", headerNames[i], strings[headerNames[i]]);
> }
>
>
Yeah, I just realized that as well. Thank you for your quick response. The code works fine now. Thanks again.
|
April 15, 2006 Re: Associative array mapping strings to strings | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrew Madigan | "Andrew Madigan" <amadigan@gmail.com> wrote in message news:e1pnqr$rh4$1@digitaldaemon.com... >> char[][] headerNames = strings.keys; >> for (int i = 0; i < headerNames.length; i++) { >> writefln("%s: %s", headerNames[i], strings[headerNames[i]]); >> } > Yeah, I just realized that as well. Thank you for your quick response. The code works fine now. Thanks again. Of course, this isn't the most efficient way to iterate through an AA, as it has to dynamically create the keys array, and then iterate through it. It's better to do foreach(char[] key, char[] value; strings) writefln(key, ": ", value); This traverses the AA directly, without allocating memory for the keys array. |
April 15, 2006 Re: Associative array mapping strings to strings | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | Jarrett Billingsley wrote:
> "Andrew Madigan" <amadigan@gmail.com> wrote in message news:e1pnqr$rh4$1@digitaldaemon.com...
>>> char[][] headerNames = strings.keys;
>>> for (int i = 0; i < headerNames.length; i++) {
>>> writefln("%s: %s", headerNames[i], strings[headerNames[i]]);
>>> }
>> Yeah, I just realized that as well. Thank you for your quick response. The code works fine now. Thanks again.
>
> Of course, this isn't the most efficient way to iterate through an AA, as
> it
> has to dynamically create the keys array, and then iterate through it.
> It's better to do
>
> foreach(char[] key, char[] value; strings)
> writefln(key, ": ", value);
>
> This traverses the AA directly, without allocating memory for the keys array.
Thank you, I was wondering what the syntax was for that. My main language is Java, I didn't realize it was that easy.
A general thought on D: Given the power and features of the language, and assuming projects such as wxd and Ares are successful, it could become what Java was supposed to be, it's already a lot better. I'm really impressed.
|
April 15, 2006 Re: Associative array mapping strings to strings | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrew Madigan | Andrew Madigan wrote:
> Jarrett Billingsley wrote:
>
>
>>"Andrew Madigan" <amadigan@gmail.com> wrote in message
>>news:e1pnqr$rh4$1@digitaldaemon.com...
>>
>>>> char[][] headerNames = strings.keys;
>>>> for (int i = 0; i < headerNames.length; i++) {
>>>> writefln("%s: %s", headerNames[i], strings[headerNames[i]]);
>>>> }
>>>
>>>Yeah, I just realized that as well. Thank you for your quick response.
>>>The code works fine now. Thanks again.
>>
>>Of course, this isn't the most efficient way to iterate through an AA, as
>>it
>>has to dynamically create the keys array, and then iterate through it. It's better to do
>>
>>foreach(char[] key, char[] value; strings)
>> writefln(key, ": ", value);
>>
>>This traverses the AA directly, without allocating memory for the keys
>>array.
>
>
> Thank you, I was wondering what the syntax was for that. My main language is
> Java, I didn't realize it was that easy.
>
> A general thought on D: Given the power and features of the language, and
> assuming projects such as wxd and Ares are successful, it could become what
> Java was supposed to be, it's already a lot better. I'm really impressed.
Just to take this a little further, the "Ultimately D-ish Version" would be:
# foreach (key, value; strings) {
# writefln(`%s: %s`c, key, value);
# }
Type inference, raw string, typed string, and formatting safety.
-- Chris Nicholson-Sauls
|
April 15, 2006 Re: Associative array mapping strings to strings | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris Nicholson-Sauls | "Chris Nicholson-Sauls" <ibisbasenji@gmail.com> wrote in message news:e1qdm4$1l8i$1@digitaldaemon.com... > # foreach (key, value; strings) { > # writefln(`%s: %s`c, key, value); > # } > > Type inference You and your dirty type inference. ;) > formatting safety. Oh! Yeah, I always forget to do that with strings. Then I end up with a format exception and wonder why. |
Copyright © 1999-2021 by the D Language Foundation