Guifan Li
Guifan Li

Reputation: 1653

Optimize a data Structure like Map<String, Map<String, Map<String, Position>>>

I am trying to put my data in a data structure like Map<String, Map<String, Map<String, Position>>>. For example, I have different accounts, each account has a different strategies, each strategies has different securities and each security has a bunch of positions.

Then the problem is that if I want to search for a position, I need to lookup for three times. Is there a better way to implement the above scenario using a better way? Someone told me I can use key + value as a key to build some HashMap(I can't recall the details and I don't quite understand that).

As far as I know, I can use a Arraylist: [account, strategy, security] as a key to build a HashMap.

Can anyone please give me some suggestion ?

Upvotes: 1

Views: 161

Answers (1)

bhavya.work
bhavya.work

Reputation: 421

I agree with shmosels' comment. I wrote this to try out. You can use it if you get stuck.

Encapsulation.java

class Encapsulation {
  String account;
  String strategy;
  String security;

  public Encapsulation(String account, String strategy, String security) {
    this.account = account;
    this.strategy = strategy;
    this.security = security;
  }

  @Override
  public String toString() {
    return "Encapsulation{" +
        "account='" + account + '\'' +
        ", strategy='" + strategy + '\'' +
        ", security='" + security + '\'' +
        '}';
  }

  @Override
  public int hashCode() {
    int result = account.hashCode();
    result = 31 * result + strategy.hashCode();
    result = 31 * result + security.hashCode();
    return result;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (!(o instanceof Encapsulation)) {
      return false;
    }
    Encapsulation that = (Encapsulation) o;
    if (!account.equals(that.account)) {
      return false;
    }
    if (!strategy.equals(that.strategy)) {
      return false;
    }
    return security.equals(that.security);
  }
}

Position.java

import java.util.Arrays;
import java.util.List;

class Position{
  @Override
  public String toString() {
    return "Position{" +
        "positions=" + Arrays.toString(positions.toArray()) +
        '}';
  }

  public List<String> positions;
}

MultiMapImplementation.java

package com.bhavya.stackoverflow.examples.q40553869;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;


public class MultiMapImplementation {
  public static void main(String[] args) {
    Map<Encapsulation, Position> encapsulationPositionMap = new HashMap<>();
    Encapsulation encapsulation = new Encapsulation("ac1", "strat1", "sec1");
    Position position = new Position();
    position.positions = Arrays.asList("position1","position2");
    encapsulationPositionMap.put(encapsulation,position);

    encapsulationPositionMap.forEach((key,value) -> System.out.println(key.toString() + value.toString()));
  }
}

Gives this output

Encapsulation{account='ac1', strategy='strat1',  security='sec1'}Position{positions=[position1, position2]}

So, in conclusion for HashMap to work efficiently your Key Class should provide the hashCode and equals methods.

Upvotes: 1

Related Questions