uniq and array of enum members (That are all strings)

Alex sascha.orlov at gmail.com
Wed Jan 16 16:40:34 UTC 2019


On Wednesday, 16 January 2019 at 16:21:12 UTC, bauss wrote:
> On Wednesday, 16 January 2019 at 16:12:28 UTC, H. S. Teoh wrote:
>> On Wed, Jan 16, 2019 at 03:57:49PM +0000, bauss via 
>> Digitalmars-d-learn wrote:
>>> Is there a way to achieve the following:
>> [...]
>>> enum Foo : string
>>> {
>>>     a = "aa",
>>>     b = "bb",
>>>     c = "cc"
>>> }
>>> 
>>> void main()
>>> {
>>>     auto a = [Foo.a, Foo.b, Foo.a, Foo.b, Foo.c];
>>> 
>>>     auto b = a.uniq;
>>> 
>>>     writeln(b);
>>>     // Expected output: [a, b, c]
>>>     // Outputs: [a, b, a, b, c]
>>> }
>>
>> .uniq only works on adjacent identical elements.  You should 
>> sort your array first.
>>
>> If you need to preserve the original order but eliminate 
>> duplicates, then you could use an AA to keep track of what has 
>> been seen. E.g.:
>>
>> 	bool[string] seen;
>> 	auto b = a.filter!((e) {
>> 			if (e in seen) return false;
>> 			seen[e] = true;
>> 			return true;
>> 		});
>>
>>
>> T
>
> Sorting will not work in my case though because it's an enum of 
> strings that are not sorted alphabetically.
>
> Right now I'm doing it manually by a foreach in similar way 
> you're using filter.
>
> I just feel like that's an overkill for something so trivial.

yeah... searching by hand is somewhat inefficient.
but this would work also with an enum, wouldn't it?

´´´
import std.stdio;

import std.algorithm : uniq;
import std.array : array;
import std.algorithm.sorting : sort;

enum Foo : string
{
     a = "aa",
     b = "bb",
     c = "cc"
}

void main()
{
     enum a = [Foo.a, Foo.b, Foo.a, Foo.b, Foo.c];

     auto b = a.sort.uniq;

     writeln(b);
}
´´´

And if you have something like immutable, dup would help, maybe?



More information about the Digitalmars-d-learn mailing list