Reverse and sort array elements

Simen Kjærås simen.kjaras at gmail.com
Tue Dec 18 12:31:02 UTC 2018


On Tuesday, 18 December 2018 at 12:07:37 UTC, Andrey wrote:
> Hi,
> Have array:
>> enum array = ["qwerty", "a", "baz"];
> Need to reverse and sort array elements to get this result:
>> [a, ytrewq, zab]
> Did this:
>> enum result = array.map!(value => value.retro()).sort();
> Got:
>> Error: template std.algorithm.sorting.sort cannot deduce 
>> function from argument types !()(MapResult!(__lambda1, 
>> string[])), candidates are:
> /usr/include/dmd/phobos/std/algorithm/sorting.d(1849,1):        
> std.algorithm.sorting.sort(alias less = "a < b", SwapStrategy 
> ss = SwapStrategy.unstable, Range)(Range r) if ((ss == 
> SwapStrategy.unstable && (hasSwappableElements!Range || 
> hasAssignableElements!Range) || ss != SwapStrategy.unstable && 
> hasAssignableElements!Range) && isRandomAccessRange!Range && 
> hasSlicing!Range && hasLength!Range)
>
> How to solve the problem?

There are in fact to instances of the same problem here:
The problem is map and retro are lazy - they return an element at 
a time, and so can't be sorted. You will need to make a arrays 
from them:

     import std.array : array;
     import std.range : retro;
     import std.algorithm : map, sort;

     enum arr = ["qwerty", "a", "baz"];
     enum result = arr
                     .map!(value => value.retro().array)
                     .array // This creates an array from map's 
result.
                     .sort();

--
   Simen


More information about the Digitalmars-d-learn mailing list