digitalmars.D.learn - Finding the index of the maximum value in an associative array

• Lyle (10/10) May 30 Hi,
• cym13 (10/20) May 30 Simple enough: get all key/values pairs in the AA, and ask for
• Lyle (4/29) May 30 Thank you! I used this solution in the end. I had looked at the
• H. S. Teoh via Digitalmars-d-learn (21/33) May 30 [...]
• John Colvin (4/30) Jun 01 writeln(aa.byPair.maxElement!(p => p[1])[0]);
```Hi,

I have an associative array of type int[ulong] and I'm trying to
get the index of the maximum value, like this:

int[ulong] aa = [1UL: 2000,
2UL: 5000,
5UL: 1000];

writeln(aa.maxIndex); // should print 2

Can anyone help me out?

Many thanks,
Lyle
```
May 30
cym13 <cpicard openmailbox.org> writes:
```On Tuesday, 30 May 2017 at 17:57:04 UTC, Lyle wrote:
Hi,

I have an associative array of type int[ulong] and I'm trying
to get the index of the maximum value, like this:

int[ulong] aa = [1UL: 2000,
2UL: 5000,
5UL: 1000];

writeln(aa.maxIndex); // should print 2

Can anyone help me out?

Many thanks,
Lyle

Simple enough: get all key/values pairs in the AA, and ask for
the element which is the maximum relatively to the value, then
take its key.

auto maxIndex(int[ulong] aa) {
import std.algorithm;

return aa.byKeyValue
.maxElement!(x => x.value)
.key;
}
```
May 30
```On Tuesday, 30 May 2017 at 18:05:02 UTC, cym13 wrote:
On Tuesday, 30 May 2017 at 17:57:04 UTC, Lyle wrote:
Hi,

I have an associative array of type int[ulong] and I'm trying
to get the index of the maximum value, like this:

int[ulong] aa = [1UL: 2000,
2UL: 5000,
5UL: 1000];

writeln(aa.maxIndex); // should print 2

Can anyone help me out?

Many thanks,
Lyle

Simple enough: get all key/values pairs in the AA, and ask for
the element which is the maximum relatively to the value, then
take its key.

auto maxIndex(int[ulong] aa) {
import std.algorithm;

return aa.byKeyValue
.maxElement!(x => x.value)
.key;
}

Thank you! I used this solution in the end. I had looked at the
.byKeyValue and .byPair methods but they didn't seem to work -
turns out I was using an old DMD version!
```
May 30
"H. S. Teoh via Digitalmars-d-learn" <digitalmars-d-learn puremagic.com> writes:
```On Tue, May 30, 2017 at 05:57:04PM +0000, Lyle via Digitalmars-d-learn wrote:
Hi,

I have an associative array of type int[ulong] and I'm trying to get
the index of the maximum value, like this:

int[ulong] aa = [1UL: 2000,
2UL: 5000,
5UL: 1000];

writeln(aa.maxIndex); // should print 2

Can anyone help me out?

[...]

Try this:

void main() {
import std.algorithm.iteration : fold;
import std.array : byPair;
import std.stdio : writeln;

int[ulong] aa = [1UL: 2000,
2UL: 5000,
5UL: 1000];

writeln(aa.byPair
.fold!((a,b) => a[1] < b[1] ? b : a)[0]);
}

Note that an associative array really isn't the best data structure if
you'll be performing this operation frequently, because you'll be
iterating over the entire contents each time. You may want to consider
using a sorted container like a RedBlackTree in std.container or

T

--
Ignorance is bliss... until you suffer the consequences!
```
May 30
John Colvin <john.loughran.colvin gmail.com> writes:
```On Tuesday, 30 May 2017 at 18:05:07 UTC, H. S. Teoh wrote:
On Tue, May 30, 2017 at 05:57:04PM +0000, Lyle via
Digitalmars-d-learn wrote:
Hi,

I have an associative array of type int[ulong] and I'm trying
to get the index of the maximum value, like this:

int[ulong] aa = [1UL: 2000,
2UL: 5000,
5UL: 1000];

writeln(aa.maxIndex); // should print 2

Can anyone help me out?

[...]

Try this:

void main() {
import std.algorithm.iteration : fold;
import std.array : byPair;
import std.stdio : writeln;

int[ulong] aa = [1UL: 2000,
2UL: 5000,
5UL: 1000];

writeln(aa.byPair
.fold!((a,b) => a[1] < b[1] ? b : a)[0]);
}

writeln(aa.byPair.maxElement!(p => p[1])[0]);

or with https://github.com/dlang/phobos/pull/5436 :

writeln(aa.byPair.maxElement!(p => p.value).key);
```
Jun 01