关于使用HashMap的方式的设计实现

时间:2012-09-11 16:01:13

标签: java hashmap concurrenthashmap

在GUI中显示帐户时,我需要显示主帐户(针对辅助帐户) 每个主要帐户可以有多个辅助帐户。

我正在尝试在HashMap中保存主要帐户信息。因为,需要稍后检索。

保存时,我还需要保存辅助帐户说明。因此,我需要使用key作为主帐户保存两个对象。

1) Secondary Account
2) Secondary Instruction.

我为帐户和指令对象重写了equals和hashcode。

我正在尝试使用主帐户哈希码作为键和值作为对象列表[2]

- 初始化

private static final Map<Integer, ArrayList<Object[]>> primaryToSecondaryAcct = new ConcurrentHashMap<Integer, ArrayList<Object[]>>();

- 放置值

final Object[] acctInstr = new Object[2];
acctInstr[0] = acct;
acctInstr[1] = instr;
if(primaryToSecondaryAcct.get(getExistingAccount().hashCode()) != null) {
    primaryToSecondaryAcct.get(getExistingAccount().hashCode()).add(acctInstr);
} else {
    final ArrayList<Object[]> acctInstrList = new ArrayList<Object[]>();
    acctInstrList.add(acctInstr);
    primaryToSecondaryAcct.put(getExistingAccount().hashCode(), acctInstrList);
}

我想知道这是否正确以及是否有更好的方法。你能建议吗?

4 个答案:

答案 0 :(得分:5)

而不是:

Map<Integer, ArrayList<Object[]>>

为什么没有

Map<Account, SecondaryInfo>

目前,您正在根据密钥存储集合,并且必须对其进行管理,当您从Map中提取时,必须对其进行迭代。我认为创建一个合适的抽象并委托给它更好。该抽象将在一个位置处理验证,迭代等,而不是每次访问Map时都要担心它。

记住 - 面向对象告诉对象为你做事,而不是向他们询问信息并自己动手。

我会用特定的Integer对象替换您的Account帐户代表。否则你将不得不管理代表不同类型的大量整数,并且很容易将它们混合起来。键入它们(虽然使用一个简单的类)意味着您可以使用自动化工具轻松地进行重构,并轻松确定类型而无需使用命名约定。

答案 1 :(得分:3)

我建议使用Account作为键,因为哈希码对于两个不同的对象可以是相同的。

答案 2 :(得分:2)

您想要的第一件事是MultiMap,您可以在Google的Guava库中找到它。这类似于Map<K, Collection<V>>,并将键映射到多个值,因此您无需重新发明它。

接下来,将Object[]替换为您自己的自定义类:

public class SecondaryInformation {
    private SecondaryAccount secondaryAccount;
    private SecondaryInstruction secondaryInstruction;

    // Constructors, getters, setters, etc.
}

所以你将拥有MultiMap<Integer, SecondaryInformation>。这是MultiMap上的some wiki info

答案 3 :(得分:2)

如果对于PrimarySecondary帐户,您的课程分类如下:

public class PrimaryAccount 
{
    int id;
    private List<SecondaryAccount> secondaryAccounts;   
}

public class SecondaryAccount
{
    int id;
    private List<String> instructions;
    PrimaryAccount primaryAccount;
}

然后,也许你甚至不需要HashMap。但是,您可能仍希望保留Hashmap以快速查找帐户: HashMap<Integer,PrimaryAccoount>,您将在其中存储帐户ID和主帐户。

这使得实现更清晰。您需要为PrimarySecondary帐户编写课程。