我正在编写一个用于处理银行账户的Java应用程序。请考虑以下类:
public class Account
{
private double balance;
private Person owner;
private String currency;
private Date openingDate;
//constructors, getters, setters, other methods
}
和
public class Bank
{
//Hashtable accounts;
//....
//testing hashtable operations
public static void main(String []args)
{
Person per1 = new Person(1,"Andrei","Moldovan","str. Lunga nr.4");
Account acc1 = new Account(per1);
Account acc2 = new Account(per1, "USD");
Person p3 = new Person(3,"Erich","Serfozo","str. Zorilor nr. 11");
Account acc3 = new Account(p3,"EUR");
acc3.deposit(110.50);
Hashtable hash = new Hashtable();
hash.put(acc1.hashCode(), acc1);
hash.put(acc2.hashCode(), acc2);
hash.put(acc3.hashCode(), acc3);
Collection hashtableValues = hash.values();
for(Object iter : hashtableValues)
{
Account acc = (Account)iter;
System.out.println(acc.toString());
}
}
}
Bank类使用Hashtable存储它包含的每个帐户。在哈希表中插入/访问帐户的正确方法是什么? (我知道我没有做对)如果发生碰撞,我想使用链接。
答案 0 :(得分:0)
如果您为每个人分配了一个唯一ID,则可以执行以下操作:
//if you want to use a HashMap, then instantiate like below
HashMap<Integer, Account> hash = new HashMap<Integer, Account>();
hash.put(acc1.getId(), acc1);
//to get Account from Person from map
hash.get(per1.getAccountId());
//iterating
for (Map.Entry<Integer, Account> entry : hash.entrySet())
{
System.out.println(entry.getKey() + "/" + entry.getValue().getPerson());
}
答案 1 :(得分:0)
每个帐户都可以与唯一编号相关联(可能是帐号或其他值),这可以是:
hash.put(acc1.getAcntNum(), acc1);
hash.(acc1.getIdentifier,acc1);
其他方式可以是,将person id作为键,值将包含一个人拥有的帐户列表:List list = new ArrayList(); list.add(acnt1); list.add(acnt2); hash.put(person.getId(),列表); 通过这种方式管理用户的所有帐户将更容易。
答案 2 :(得分:0)
你应该对标准的Java集合进行更多的研究,因为你似乎对你想要的东西感到有点困惑,而你似乎对新的Hashtable
类及其内部实现感兴趣。
地图背后的理论,即旧的Hashtable
和现代HashMap
都是,它是从特定的键映射到一个值。地图要么包含一个键,要么不包含。如果它确实包含密钥,则可以获取与密钥关联的值。
哈希表的运行方式对您来说应该是不透明的。可以搜索关键 - >值对的平面列表,并且您将获得相同的结果。哈希表通过使用哈希码来改进此操作的速度,哈希码可以是任意数字,只要它对于相同的密钥始终具有相同的数字。如果多个不同的密钥具有相同的哈希码,则无关紧要,因为该表在表中的潜在密钥上使用.equals
以确保它具有完全正确的密钥。但是哈希码越具体,就越不可能检查多个密钥。
您应该更关心要存储的内容,要检索的内容。您想按帐号查找帐户吗?你想查看谁拥有它们的账户?您需要根据需要设计数据结构。
例如,要处理查找某个人拥有的帐户(并且某个人可以拥有多个帐户),您可以制作一个从Map
(密钥)映射到的Person
集:
Account
此代码假设final Map<Person, Set<Account>> accountsByPerson = new HashMap<>();
// add account acc1 for a person per1
Set<Account> accountsForThisPerson = accountsByPerson.get(per1);
if (accountsForThisPerson == null) {
accountsForThisPerson = new HashSet<>();
accountsByPerson.put(per1, accountsForThisPerson);
}
accountsForThisPerson.add(acc1);
// retrieve one person's accounts:
final Set<Account> accountsOfPerson1 = accountsByPerson.get(per1);
if (per1 == null) {
System.out.println(per1 + " has no accounts");
}
else {
System.out.println(per1 + " has " + accountsOfPerson1.size() + " account(s)");
for (final Account a : accountsOfPerson1) {
System.out.println(perl + " has account " + a);
}
}
和Account
都实现了Person
和equals
方法,它始终给出正确的答案:如果我有两个不同的对象代表相同的帐户,hashCode
表示它们是相同的,equals
为它们提供相同的结果,一旦我将它们放入像HashMap或HashSet这样的结构中,它们的hashCode
就不会改变