array to string functional?

Vladimir Panteleev thecybershadow.lists at gmail.com
Sun Sep 16 06:50:56 UTC 2018


On Friday, 14 September 2018 at 20:43:45 UTC, SrMordred wrote:
> On Friday, 14 September 2018 at 19:44:37 UTC, berni wrote:
>> a) I've got an int[] which contains only 0 und 1. And I want 
>> to end with a string, containing 0 and 1. So [1,1,0,1,0,1] 
>> should become "110101". Of course I can do this with a loop 
>> and ~. But I think it should be doable with functional style, 
>> which is something I would like to understand better. Can 
>> anyone help me here? (I think a.map!(a=>to!char(a+'0')) does 
>> the trick, but is this good style or is there a better way?)

Yes, that's fine. That gives you a range; if you want an array, 
call array() with that expression. Also, since you know the 
addition won't overflow, you can substitute the to!char call with 
a cast (arr.map!(c => cast(char)(c + '0')).array).

Another option is to index a string literal: arr.map!(c => 
"01"[c]).array

> auto a = [1,0,1,1,1,0,1,0,1,1,1,1,0];
>     a.map!(to!string)
>      .join("")
>      .chunks(4)
>      .map!(to!string) //don´t know why the chunks are not 
> already strings at this point ;/
>      .writeln;

That's needlessly complicated and inefficient; this will allocate 
one string per array element.

If you don't need the result to be actual arrays, this works:

	auto res = [1,0,1,1,1,0,1,0,1,1,1,1,0]
		.map!(c => "01"[c])
		.chunks(4);
	assert(equal!equal(res, ["1011","1010","1111","0"]));

If you need a real array of arrays:

	auto arr = res
		.map!array
		.array;
	assert(arr == ["1011","1010","1111","0"]);



More information about the Digitalmars-d-learn mailing list