Jump to page: 1 2
Thread overview
Tuple Array Sorting
Dec 11, 2017
Vino
Dec 11, 2017
Vino
Dec 11, 2017
Vino
Dec 11, 2017
Biotronic
Dec 11, 2017
Vino
Dec 11, 2017
Biotronic
Dec 11, 2017
Biotronic
Dec 11, 2017
Vino
Dec 11, 2017
Seb
Dec 11, 2017
Vino
Dec 11, 2017
Biotronic
Dec 12, 2017
Vino
Dec 12, 2017
Biotronic
Dec 13, 2017
Vino
Dec 15, 2017
Vino
Dec 15, 2017
Biotronic
December 11, 2017
Hi All,

  Request your help in tuple array sorting, I have a function which returns tuple values as below so how do i sort this type of array based on the time stamp(Acceding order) .

Eg:
C:\Temp\EXPORT\dir2   2017-Sep-06 16:06:58
C:\Temp\BACKUP\dir2   2017-Sep-09 22:44:11
C:\Temp\TEAM\dir1     2017-Sep-10 16:06:42
C:\Temp\USER\dir3     2017-Sep-05 16:06:57

Required Output:
C:\Temp\USER\dir3     2017-Sep-05 16:06:57
C:\Temp\EXPORT\dir2   2017-Sep-06 16:06:58
C:\Temp\BACKUP\dir2   2017-Sep-09 22:44:11
C:\Temp\TEAM\dir1     2017-Sep-10 16:06:42

From,
Vino.B
December 11, 2017
On Monday, 11 December 2017 at 13:58:49 UTC, Vino wrote:
> Hi All,
>
>   Request your help in tuple array sorting, I have a function which returns tuple values as below so how do i sort this type of array based on the time stamp(Acceding order) .
>
> Eg:
> C:\Temp\EXPORT\dir2   2017-Sep-06 16:06:58
> C:\Temp\BACKUP\dir2   2017-Sep-09 22:44:11
> C:\Temp\TEAM\dir1     2017-Sep-10 16:06:42
> C:\Temp\USER\dir3     2017-Sep-05 16:06:57
>
> Required Output:
> C:\Temp\USER\dir3     2017-Sep-05 16:06:57
> C:\Temp\EXPORT\dir2   2017-Sep-06 16:06:58
> C:\Temp\BACKUP\dir2   2017-Sep-09 22:44:11
> C:\Temp\TEAM\dir1     2017-Sep-10 16:06:42
>
> From,
> Vino.B

A small additional Information

C:\Temp\EXPORT\dir2   2017-Sep-06 16:06:58 - Array!(Tuple!(string, string)) (Array 1)
C:\Temp\BACKUP\dir2   2017-Sep-09 22:44:11 - Array!(Tuple!(string, string)) (Array 2)
C:\Temp\TEAM\dir1     2017-Sep-10 16:06:42 - Array!(Tuple!(string, string)) (Array 3)
C:\Temp\USER\dir3     2017-Sep-05 16:06:57 - Array!(Tuple!(string, string)) (Array 4)

 Required Output:
C:\Temp\USER\dir3     2017-Sep-05 16:06:57 - Array!(Tuple!(string, string)) (Array 4)
C:\Temp\EXPORT\dir2   2017-Sep-06 16:06:58 - Array!(Tuple!(string, string)) (Array 1)
C:\Temp\BACKUP\dir2   2017-Sep-09 22:44:11 - Array!(Tuple!(string, string)) (Array 2)
C:\Temp\TEAM\dir1     2017-Sep-10 16:06:42 - Array!(Tuple!(string, string)) (Array 3)

From,
Vino.B

December 11, 2017
On Monday, 11 December 2017 at 14:25:16 UTC, Vino wrote:
> On Monday, 11 December 2017 at 13:58:49 UTC, Vino wrote:
>> Hi All,
>>
>>   Request your help in tuple array sorting, I have a function which returns tuple values as below so how do i sort this type of array based on the time stamp(Acceding order) .
>>
>> Eg:
>> C:\Temp\EXPORT\dir2   2017-Sep-06 16:06:58
>> C:\Temp\BACKUP\dir2   2017-Sep-09 22:44:11
>> C:\Temp\TEAM\dir1     2017-Sep-10 16:06:42
>> C:\Temp\USER\dir3     2017-Sep-05 16:06:57
>>
>> Required Output:
>> C:\Temp\USER\dir3     2017-Sep-05 16:06:57
>> C:\Temp\EXPORT\dir2   2017-Sep-06 16:06:58
>> C:\Temp\BACKUP\dir2   2017-Sep-09 22:44:11
>> C:\Temp\TEAM\dir1     2017-Sep-10 16:06:42
>>
>> From,
>> Vino.B
>
> A small additional Information
>
> C:\Temp\EXPORT\dir2   2017-Sep-06 16:06:58 - Array!(Tuple!(string, string)) (Array 1)
> C:\Temp\BACKUP\dir2   2017-Sep-09 22:44:11 - Array!(Tuple!(string, string)) (Array 2)
> C:\Temp\TEAM\dir1     2017-Sep-10 16:06:42 - Array!(Tuple!(string, string)) (Array 3)
> C:\Temp\USER\dir3     2017-Sep-05 16:06:57 - Array!(Tuple!(string, string)) (Array 4)
>
>  Required Output:
> C:\Temp\USER\dir3     2017-Sep-05 16:06:57 - Array!(Tuple!(string, string)) (Array 4)
> C:\Temp\EXPORT\dir2   2017-Sep-06 16:06:58 - Array!(Tuple!(string, string)) (Array 1)
> C:\Temp\BACKUP\dir2   2017-Sep-09 22:44:11 - Array!(Tuple!(string, string)) (Array 2)
> C:\Temp\TEAM\dir1     2017-Sep-10 16:06:42 - Array!(Tuple!(string, string)) (Array 3)
>
> From,
> Vino.B

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]));
}
}

Output

C:\Temp\BACKUP\DND3                                     2017-Sep-05 14:31:00
C:\Temp\BACKUP\dir1                                     2017-Sep-06 16:06:42
C:\Temp\BACKUP\dir2                                     2017-Sep-09 22:44:11
C:\Temp\BACKUP\dir3                                     2017-Dec-10 06:56:07
C:\Temp\BACKUP\t1                                       2017-Dec-11 04:10:02
C:\Temp\EXPORT\DND6                                     2017-Sep-05 14:31:00
C:\Temp\PROD_TEAM\DND1                                  2017-Sep-05 14:31:01

Output Required
C:\Temp\BACKUP\DND3                                     2017-Sep-05 14:31:00
C:\Temp\EXPORT\DND6                                     2017-Sep-05 14:31:00
C:\Temp\PROD_TEAM\DND1                                  2017-Sep-05 14:31:01
C:\Temp\BACKUP\dir1                                     2017-Sep-06 16:06:42
C:\Temp\BACKUP\dir2                                     2017-Sep-09 22:44:11
C:\Temp\BACKUP\dir3                                     2017-Dec-10 06:56:07
C:\Temp\BACKUP\t1                                       2017-Dec-11 04:10:02


From,
Vino.B
December 11, 2017
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
December 11, 2017
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

From,
Vino.B

December 11, 2017
On Monday, 11 December 2017 at 15:33:08 UTC, Vino wrote:
>  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.

Works on my machine. Of course, since time toSimpleString returns non-ISO8601, the sorting might not make perfect sense ("2017-Dec-12" < "2017-Jan-01"). Testing with multiple folders gives perfectly sorted output. If you want it sorted by date instead of by string representation of date, feel free to remove .toSimpleString[0 .. 20].

--
  Biotronic
December 11, 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
December 11, 2017
On Monday, 11 December 2017 at 15:54:11 UTC, Biotronic wrote:
> On Monday, 11 December 2017 at 15:33:08 UTC, Vino wrote:
>> On Monday, 11 December 2017 at 15:15:47 UTC, Biotronic wrote:
>>>   [...]
>>
>> 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

Hi Biotronic,

 I tried your code with multiple folder's , but no luck the output is not sorted.

Program:
import std.algorithm: filter, map, sort;
import std.array;
import std.file: SpanMode, dirEntries, isDir ;
import std.stdio: writefln, writeln;
import std.typecons: Tuple, tuple;

void main () {
auto FFs =  ["C:\\Temp\\sapnas2\\BACKUP", "C:\\Temp\\sapnas2\\EXPORT", "C:\\Temp\\sapnas2\\PROD_TEAM"];
auto sorted = FFs
.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);
}

From,
Vino.B

December 11, 2017
On Monday, 11 December 2017 at 16:15:14 UTC, Vino wrote:
> On Monday, 11 December 2017 at 15:54:11 UTC, Biotronic wrote:
>>   [...]
>
> Hi Biotronic,
>
>  I tried your code with multiple folder's , but no luck the output is not sorted.
>
> Program:
> import std.algorithm: filter, map, sort;
> import std.array;
> import std.file: SpanMode, dirEntries, isDir ;
> import std.stdio: writefln, writeln;
> import std.typecons: Tuple, tuple;
>
> void main () {
> auto FFs =  ["C:\\Temp\\sapnas2\\BACKUP", "C:\\Temp\\sapnas2\\EXPORT", "C:\\Temp\\sapnas2\\PROD_TEAM"];
> auto sorted = FFs
> .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);
> }
>
> From,
> Vino.B

Your program still contains toSimpleString in the sort lambda. Have you, as suggested, removed it?
As Biotronic explained, sorting on the string representation of dates can't work.
December 11, 2017
On Monday, 11 December 2017 at 19:23:40 UTC, Seb wrote:
> On Monday, 11 December 2017 at 16:15:14 UTC, Vino wrote:
>> On Monday, 11 December 2017 at 15:54:11 UTC, Biotronic wrote:
>>>   [...]
>>
>> Hi Biotronic,
>>
>>  I tried your code with multiple folder's , but no luck the output is not sorted.
>>
>> Program:
>> import std.algorithm: filter, map, sort;
>> import std.array;
>> import std.file: SpanMode, dirEntries, isDir ;
>> import std.stdio: writefln, writeln;
>> import std.typecons: Tuple, tuple;
>>
>> void main () {
>> auto FFs =  ["C:\\Temp\\sapnas2\\BACKUP", "C:\\Temp\\sapnas2\\EXPORT", "C:\\Temp\\sapnas2\\PROD_TEAM"];
>> auto sorted = FFs
>> .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);
>> }
>>
>> From,
>> Vino.B
>
> Your program still contains toSimpleString in the sort lambda. Have you, as suggested, removed it?
> As Biotronic explained, sorting on the string representation of dates can't work.

Hi,

 Yes, I have changed the code as below, and removed the toSimpleString, even then no luck.

Code:
import std.algorithm;
import std.container.array;
import std.file: SpanMode, dirEntries, isDir ;
import std.stdio: writefln, writeln;
import std.typecons: Tuple, tuple;
import std.range: chain;

void main () {
auto FFs =  ["C:\\Temp\\BACKUP", "C:\\Temp\\EXPORT", "C:\\Temp\\PROD_TEAM"];
foreach(d; FFs[]) {
auto dFiles = Array!(Tuple!(string, SysTime))(dirEntries(d, SpanMode.shallow).filter!(a => a.isDir).map!(a => tuple(a.name, a.timeCreated)));
writefln("%(%-(%-63s %s %)\n%)", chain(dFiles[]).sort!((a, b) => a[1] < b[1]));
}
}

Output
C:\Temp\BACKUP\DND3                                     2017-Sep-05 14:31:00.7037169
C:\Temp\BACKUP\dir1                                     2017-Sep-06 16:06:42.7223837
C:\Temp\BACKUP\dir2                                     2017-Sep-09 22:44:11.7604069
C:\Temp\BACKUP\dir3                                     2017-Dec-10 06:56:07.5122231
C:\Temp\BACKUP\t1                                       2017-Dec-11 04:10:02.6413853

C:\Temp\EXPORT\DND6                                     2017-Sep-05 14:31:00.8909172
C:\Temp\PROD_TEAM\DND1                                  2017-Sep-05 14:31:01.8269189

Required Output:
C:\Temp\BACKUP\DND3                                     2017-Sep-05 14:31:00.7037169
C:\Temp\EXPORT\DND6                                     2017-Sep-05 14:31:00.8909172
C:\Temp\PROD_TEAM\DND1                                  2017-Sep-05 14:31:01.8269189
C:\Temp\BACKUP\dir1                                     2017-Sep-06 16:06:42.7223837
C:\Temp\BACKUP\dir2                                     2017-Sep-09 22:44:11.7604069
C:\Temp\BACKUP\dir3                                     2017-Dec-10 06:56:07.5122231
C:\Temp\BACKUP\t1                                       2017-Dec-11 04:10:02.6413853

From,
Vino.B

« First   ‹ Prev
1 2