[WORK] groupBy is in! Next: aggregate

Ary Borenszweig via Digitalmars-d digitalmars-d at puremagic.com
Fri Jan 23 12:19:30 PST 2015


On 1/23/15 3:08 PM, Andrei Alexandrescu wrote:
> So H.S. Teoh awesomely took
> https://github.com/D-Programming-Language/phobos/pull/2878 to
> completion. We now have a working and fast relational "group by" facility.
>
> See it at work!
>
> ----
> #!/usr/bin/rdmd
>
> void main()
> {
>      import std.algorithm, std.stdio;
>      [293, 453, 600, 929, 339, 812, 222, 680, 529, 768]
>          .groupBy!(a => a & 1)
>          .writeln;
> }
> ----
>
> [[293, 453], [600], [929, 339], [812, 222, 680], [529], [768]]
>
> The next step is to define an aggregate() function, which is a lot
> similar to reduce() but works on ranges of ranges and aggregates a
> function over each group. Continuing the previous example:
>
>      [293, 453, 600, 929, 339, 812, 222, 680, 529, 768]
>          .groupBy!(a => a & 1)
>          .aggregate!max
>          .writeln;
>
> should print:
>
> [453, 600, 929, 812, 529, 768]
>
> The aggregate function should support aggregating several functions at
> once, e.g. aggregate!(min, max) etc.
>
> Takers?
>
>
> Andrei

In most languages group by yields a tuple of {group key, group values}.

For example (Ruby or Crystal):

a = [1, 4, 2, 4, 5, 2, 3, 7, 9]
groups = a.group_by { |x| x % 3 }
puts groups #=> {1 => [1, 4, 4, 7], 2 => [2, 5, 2], 0 => [3, 9]}

In C# it's also called group by: http://www.dotnetperls.com/groupby

Java: 
http://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#groupingBy-java.util.function.Function-

SQL: http://www.w3schools.com/sql/sql_groupby.asp

So I'm not sure "groupBy" is a good name for this.


More information about the Digitalmars-d mailing list