2016-11-11 92 views
1

我试图将我的数据放在像Map<String, Map<String, Map<String, Position>>>这样的数据结构中。例如,我有不同的账户,每个账户都有不同的策略,每种策略都有不同的证券,每种证券都有一堆头寸。优化数据结构如地图<String,Map <String,Map <String,Position >>>

然后问题是,如果我想搜索一个职位,我需要查找三次。有没有更好的方式使用更好的方式来实现上述场景?有人告诉我,我可以使用键+值作为构建一些HashMap的关键(我不记得细节,我不太明白这一点)。

据我所知,我可以使用Arraylist: [account, strategy, security]作为构建HashMap的关键。

任何人都可以请给我一些建议吗?

+6

创建封装帐户,策略,安全性的自定义类。实现'equals()'和'hashCode()',你就可以将它用作关键字。 – shmosel

+0

你可以尝试multimap http://stackoverflow.com/questions/36244782/refactoring-java-map-of-map-of-map –

+1

很抱歉,如果它是明显的,但我认为你需要使用一些数据库。 –

回答

1

我同意shmosels的评论。我写这个来试试。如果卡住了,可以使用它。

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())); 
    } 
} 

给出了这样的输出

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

所以,结论HashMap来提高工作效率你的关键类应该提供将hashCode和equals方法。

相关问题