在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);
}
我想知道这是否正确以及是否有更好的方法。你能建议吗?
答案 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)
如果对于Primary
和Secondary
帐户,您的课程分类如下:
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和主帐户。
这使得实现更清晰。您需要为Primary
和Secondary
帐户编写课程。