Reputation: 1653
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
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