How to get position of key/value in LinkedHashMap using its key

java, linkedhashmap

Solution

`HashMap` implementations in general are un-ordered for `Iteration`.

`LinkedHashMap` is predictablely ordered for `Iteration` ( insertion order ) but does not expose the `List` interface and a `LinkedList` ( which is what mirrors the key set insertion order ) does not track index position itself either, it is very in-efficient to find the index as well. The `LinkedHashMap` doesn't expose the reference to the internal `LinkedList` either.

The actual "Linked List" behavior is implementation specific. Some may actually use an instance of `LinkedList` some many just have `Entry` track a previous and next `Entry` and use that as its implementation. Don't assume anything without looking at the source.

The `KeySet` that contains the keys does not guarantee order as well because of the hashing algorithms used for placement in the backing data structure of the inherited `HashMap`. So you can't use that.

The only way to do this, without writing your own implementation, is to walk the `Iterator` which uses the mirroring `LinkedList` and keep a count where you are, this will be very in-efficient with large data sets.

Solution

What it sounds like you want is original insertion order index positions, you would have to mirror the keys in the `KeySet` in something like an `ArrayList`, keep it in sync with updates to the `HashMap` and use it for finding position. Creating a sub-class of `HashMap`, say `IndexedHashMap` and adding this `ArrayList` internally and adding a `.getKeyIndex(<K> key)` that delegates to the internal `ArrayList` `.indexOf()` is probably the best way to go about this.

This is what `LinkedHashMap` does but with a `LinkedList` mirroring the `KeySet` instead of an `ArrayList`.

Problem

I have a `LinkedHashMap` (called info) that contains name/age (string/int) pairs. How can I get the position of the key/value if I input the key? For example, if my `LinkedHashMap` looked like this `{bob=12, jeremy=42, carly=21}` and I was to search `jeremy`, it should return `1` as its in position 1. I was hoping I can use something like `info.getIndex("jeremy")`.

Original source

Related problems