Filtering Associative Array Key-Values the D way

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jun 24 10:32:03 PDT 2015


On 06/24/2015 09:08 AM, David DeWitt wrote:
> I'm trying to understand filtering an Associative Array the D way.  I
> have the code below
> (Using while readln cause problem failing on Debian using
> byLineCopy()).  When the byKeyValue().filter evaluates to reduce the
> number of Keys:Values to only the ones in the filtered header, what is
> the best way to transform the Pair back to an AA instead of having to
> run the foreach loop after?  Basically if the file has 300 columns and
> 300 in the full header but only 15 in the filtered header I want the
> return of rec to only be the 15 in an Associative Array.  Thanks :)
>
>
>      string line;
>      string[string][] records;
>      while ((line = f.readln()) !is null){
>          string[string] record;
>          auto rec = assocArray(zip(h1.fullHeader, splitter(line,',')))
> .byKeyValue().filter!(a=>h1.filteredHeader.canFind(a.key));
>
>          foreach(r;rec){
>              record[r.key] = r.value;
>          }
>          records ~= record;
>      }

It would be more efficient to filter the input before creating a larger 
AA to be thrown away:

import std.stdio;
import std.range;
import std.algorithm;

void main()
{
     auto keys = 10.iota;
     auto values = keys.map!(k => 10 * k);

     auto result = zip(keys, values)
                   .filter!(t => t[0] % 2)
                   .assocArray;

     writefln("%(%s: %s\n%)", result);
}

The AA contains elements with odd keys:

1: 10
5: 50
9: 90
3: 30
7: 70

Ali



More information about the Digitalmars-d-learn mailing list