counting words

Brad Anderson eco at gnuk.net
Fri Jun 28 09:42:24 PDT 2013


On Friday, 28 June 2013 at 16:25:25 UTC, Brad Anderson wrote:
> On Friday, 28 June 2013 at 16:04:35 UTC, Benjamin Thaut wrote:
>> I'm currently making a few tests with std.algorithm, 
>> std.range, etc
>>
>> I have a arry of words. Is it possible to count how often each 
>> word is contained in the array and then sort the array by the 
>> count of the individual words by chaining ranges? (e.g. 
>> without using a foreach loop + hashmap)?
>
> If you don't mind sorting twice:
>
> words.sort()
>      .group()
>      .array()
>      .sort!((a, b)=> a[1] > b[1])
>      .map!(a => a[0])
>      .copy(words);
>
> You could also do it with a hashmap to keep the count.

Like so:

     size_t[string] dic;
     words.map!((w) { ++dic[w.idup]; return w; })
          .array // eager (so dic is filled first), sortable
          .sort!((a, b) { bool less = dic[a] > dic[b]; return less 
|| less && a < b; })
          .uniq
          .copy(words);

It's a bit ugly and abuses side effects with the hash map.  The 
order will differ from the other program when words have 
identical counts.


More information about the Digitalmars-d-learn mailing list