On Sunday, 18 February 2018 at 11:55:37 UTC, Vino wrote:
Hi All,
Request your help on printing the all index of an array
element , eg; the below code prints the index of the string
"Test2" as [1], but the string "Test2" is present 2 times at
index 1 and 4, so how do I print all the index of a given
string.
import std.stdio;
import std.container;
import std.algorithm;
void main () {
auto a = Array!string("Test1", "Test2", "Test3", "Test1",
"Test2");
writeln(SList!int(a[].countUntil("Test2"))[]);
}
Output
[1]
Expected
[1, 4]
From,
Vino.B
countUntil is good when you want to avoid having to look at all
your data, but in this case I don't think it's the best solution.
You could do a loop storing each index and then restart your
countUntil from there, but quite frankly it would be easier to
just loop over the array at that point:
ulong[] result;
for (ulong index=0 ; index<a.length ; index++)
if (a[index] == "Test2")
result ~= index;
writeln(result);
You could also use enumerate to make this a tad easier:
import std.range: enumerate;
ulong[] result;
foreach (index, value ; a[].enumerate)
if (a[index] == "Test2")
result ~= index;
writeln(result);
However, if you want a more streamlined, functionnal solution,
you can go all the way and avoid all explicit loops and
intermediate variables using fold:
import std.range: enumerate;
import std.algorithm: fold;
a[]
.enumerate
.fold!((a, b) => b[1] == "Test2" ? a ~ b[0] :
a)(cast(ulong[])[])
.writeln;