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;


Reply via email to