Simplest way to convert an array into a set
H. S. Teoh
hsteoh at qfbox.info
Mon Feb 13 18:48:47 UTC 2023
On Mon, Feb 13, 2023 at 06:04:40PM +0000, Matt via Digitalmars-d-learn wrote:
> Obviously, there is no "set" object in D,
Actually, bool[T] could be used as a set object of sorts. Or even
void[0][T], though that's a little more verbose to type. But this can be
aliased to something nicer (see below).
> but I was wondering what the quickest way to remove duplicates from an
> array would be. I was convinced I'd seen a "unique" method somewhere,
> but I've looked through the documentation for std.array, std.algorithm
> AND std.range, and I've either missed it, or my memory is playing
> tricks on me. That, or I'm looking in the wrong place entirely, of
> course
Try this:
-------------------------snip-------------------------
import std;
auto deduplicate(R)(R input)
if (isInputRange!R)
{
alias Unit = void[0];
enum unit = Unit.init;
Unit[ElementType!R] seen;
return input.filter!((e) {
if (e in seen) return false;
seen[e] = unit;
return true;
});
}
unittest {
assert([ 1, 2, 3, 4, 2, 5, 6, 4, 7 ].deduplicate.array ==
[ 1, 2, 3, 4, 5, 6, 7 ]);
assert([ "abc", "def", "def", "ghi", "abc", "jkl" ].deduplicate.array ==
[ "abc", "def", "ghi", "jkl" ]);
}
-------------------------snip-------------------------
T
--
Маленькие детки - маленькие бедки.
More information about the Digitalmars-d-learn
mailing list