Tuple Array Sorting

Biotronic simen.kjaras at gmail.com
Mon Dec 11 15:54:11 UTC 2017


On Monday, 11 December 2017 at 15:33:08 UTC, Vino wrote:
> On Monday, 11 December 2017 at 15:15:47 UTC, Biotronic wrote:
>> On Monday, 11 December 2017 at 14:52:35 UTC, Vino wrote:
>>> Example Program and Output
>>>
>>> import std.algorithm: filter, map, sort;
>>> import std.container.array;
>>> import std.file: SpanMode, dirEntries, isDir ;
>>> import std.range: chain;
>>> import std.stdio: writefln;
>>> import std.typecons: Tuple, tuple;
>>>
>>> void main () {
>>> auto FFs =  Array!(string)("C:\\Temp\\BACKUP", 
>>> "C:\\Temp\\EXPORT", "C:\\Temp\\PROD_TEAM");
>>> int AgeSize = 2;
>>> foreach(d; FFs[]) {
>>> auto dFiles = Array!(Tuple!(string, string))(dirEntries(d, 
>>> SpanMode.shallow).filter!(a => a.isDir).map!(a => 
>>> tuple(a.name, a.timeCreated.toSimpleString[0 .. 20])));
>>> writefln("%(%-(%-63s %s %)\n%)", chain(dFiles[]).sort!((a,b) 
>>> => a[0] > b[0]));
>>> }
>>> }
>>
>> You're somewhat close. You're sorting based on the 0th element 
>> of your tuples, while you should sort on the 1st. Something 
>> like this:
>>
>> import std.algorithm: filter, map, sort;
>> import std.array : array;
>> import std.file: SpanMode, dirEntries, isDir ;
>> import std.range: join;
>> import std.stdio: writefln;
>> import std.typecons: tuple;
>>
>> void main () {
>>     auto folders =  ["D:\\Dev"];
>>
>>     auto sorted = folders
>>         .map!(a => dirEntries(a, SpanMode.shallow))
>>         .join
>>         .filter!(a => a.isDir)
>>         .map!(a => tuple(a.name, 
>> a.timeCreated.toSimpleString[0 .. 20]))
>>         .array
>>         .sort!((a,b) => a[1] > b[1]);
>>
>>     writefln("%( %( %-63s %s %) \n%)", sorted);
>> }
>>
>> --
>>   Biotronic
>
> Hi,
>
>  I tired that but no luck, below is the output, in your code 
> you have one folder "auto folders =  ["D:\\Dev"];" if you have 
> multiple folder then output is not sorted.
>
> C:\Temp\BACKUP\dir2                                     
> 2017-Sep-09 22:44:11
> C:\Temp\BACKUP\dir1                                     
> 2017-Sep-06 16:06:42
> C:\Temp\BACKUP\DND3                                     
> 2017-Sep-05 14:31:00
> C:\Temp\BACKUP\t1                                       
> 2017-Dec-11 04:10:02
> C:\Temp\BACKUP\dir3                                     
> 2017-Dec-10 06:56:07
> C:\Temp\EXPORT\DND6                                     
> 2017-Sep-05 14:31:00
> C:\Temp\PROD_TEAM\DND1                                  
> 2017-Sep-05 14:31:01

Are you sure that's the output from my code? Let's step through 
the code:

     // Iterating over folders:
     folders
     // Create a range where each element is a range of DirEntry
     // in the given folder.
     .map!(a => dirEntries(a, SpanMode.shallow))
     // Join these together to a single range of DirEntry instead 
of
     // a range-of-ranges-of-DirEntry.
     .join
     // Remove anything that's not a folder.
     .filter!(a => a.isDir)
     // Grab the information we actually care about.
     .map!(a => tuple(a.name, a.timeCreated))
     // Enumerate to an array, so we can sort it.
     .array
     // Sort this array by the second tuple element (timeCreated).
     .sort!((a,b) => a[1] > b[1]);

If this code does not do what you're asking, there's a bug 
outside of the code, probably in the standard library.

If instead you are invoking the program multiple times with a 
single folder each time, the output you describe is to be 
expected.

Apart from that, I'm not sure what could be wrong.

--
   Biotronic


More information about the Digitalmars-d-learn mailing list