Comparison of multidimensional associative arrays

Anonymouse zorael at gmail.com
Wed Feb 8 19:54:13 UTC 2023


On Wednesday, 8 February 2023 at 19:04:15 UTC, Alexander Zhirov 
wrote:
> [...]

I would write a data structure and use struct members to reason 
about things, but that's probably just preference.

```
import std;

struct DatabaseEntry
{
     int id = -1;
     string deleted;
     string name;

     this(string[string] aa)
     {
         this.id = aa["id"].to!int;
         this.deleted = aa["deleted"];
         this.name = aa["name"];
     }

     auto opEquals(typeof(this) that) const
     {
         return
             (this.id == that.id) &&
             (this.deleted == that.deleted) &&
             (this.name == that.name);
     }
}

auto buildSortedEntryRange(string[string][int] aa)
{
     return aa
         .byValue
         .map!(entry => DatabaseEntry(entry))
         .array
         .sort!((a,b) => a.id < b.id);
}

void main()
{
     auto arrayA =
     [
         4:["id":"4", "deleted":"f", "name":"6.2"],
         3:["id":"3", "deleted":"f", "name":"5.6_hwlister"],
         2:["id":"2", "deleted":"t", "name":"6.2"],
         1:["id":"1", "deleted":"f", "name":"5.6"]
     ];

     auto arrayB =
     [
         6:["id":"6", "deleted":"f", "name":"6.2_test"],
         5:["id":"5", "deleted":"f", "name":"5.6_test"],
         4:["id":"4", "deleted":"f", "name":"6.2_hwlister"],
         3:["id":"3", "deleted":"f", "name":"5.6_hwlister"],
         2:["id":"2", "deleted":"f", "name":"6.2"],
         1:["id":"1", "deleted":"f", "name":"5.6"]
     ];

     auto entriesFromA = buildSortedEntryRange(arrayA);
     auto entriesFromB = buildSortedEntryRange(arrayB);
     auto range = zip(StoppingPolicy.longest, entriesFromA, 
entriesFromB);

     foreach (entryA, entryB; range)
     {
         if (entryA != entryB)
         {
             writeln(entryB);
             // ...
         }
     }
}
```

Output is:

```
DatabaseEntry(2, "f", "6.2")
DatabaseEntry(4, "f", "6.2_hwlister")
DatabaseEntry(5, "f", "5.6_test")
DatabaseEntry(6, "f", "6.2_test")
```


More information about the Digitalmars-d-learn mailing list