how to get top N distinct elements from range?

jerro a at a.com
Fri Mar 8 09:01:22 PST 2013


On Friday, 8 March 2013 at 15:53:56 UTC, Andrea Fontana wrote:
> On Friday, 8 March 2013 at 14:43:29 UTC, jerro wrote:
>> On Friday, 8 March 2013 at 13:33:24 UTC, Andrea Fontana wrote:
>>> I wonder if exists a way to get top n distinct elements from 
>>> a range (infinite too!)
>>
>> It's impossible to do that for infinite ranges
>
> Why?
>
> sequence!"n*2".myTopDistinct!"a==b"(3);
>
> will give [2,4,6]

I didn't understand you correctly then. I thought that top n 
distinct elements meant n largest distinct elements. Now, I'm 
assuming that you just need first n distinct elements.

> We just need to keep a list of "just-seen" elements
> But I don't know how to make it lazy

You could write your own range that uses an associative array to 
check for duplicates:

struct Unique(R)
{
     R r;
     bool[elementType!R] seen;

     @property front(){ return r.front; }
     @property empty(){ return r.empty; }
     void popFront()
     {
         seen[r] = bool.init;
         while(r.front in seen)
             r.popFront();
     }
}

I don't think there's anything like this in Phobos.


More information about the Digitalmars-d-learn mailing list