Java 存储用户帐户和事务的HashMap

Java 存储用户帐户和事务的HashMap,java,hashmap,Java,Hashmap,我想知道是否可以在同一个HashMap中存储两组数据,如: {key:string,account:object,transactions:{timestamp:datetime,type:byte,amount:int} 如果是,你会建议如何实现这样的模式。如果不是,有没有不使用第三方库的替代方案 假设我们有一个对象帐户。每个帐户都有事务。目标是能够将事务添加到帐户并在以后显示它们。首先,您需要声明适当的类来存储所需的数据。例如,事务: public class Transaction {

我想知道是否可以在同一个HashMap中存储两组数据,如:

{key:string,account:object,transactions:{timestamp:datetime,type:byte,amount:int}

如果是,你会建议如何实现这样的模式。如果不是,有没有不使用第三方库的替代方案


假设我们有一个对象帐户。每个帐户都有事务。目标是能够将事务添加到帐户并在以后显示它们。

首先,您需要声明适当的类来存储所需的数据。例如,事务:

public class Transaction {
    private Date timestamp;
    private byte type; // I prefer to use an enum here...
    private int amount;
    .... // next add the getter and setter for each attribute
}
然后,您可以声明类以包含帐户数据。例如:

public class Account {
    .... // declare the fields of the account, for example, name, address, ...
    private  List<Transaction> transactions;
    .... // next add the getter and setter for each attribute
}
公共类帐户{
....//声明帐户的字段,例如,名称、地址等。。。
私人清单交易;
..//next为每个属性添加getter和setter
}
最后,您可以用所有数据声明并填充HashMap

// first create the HashMap
HashMap<String, Account> accounts = new HashMap<String, Account>();

// then populate the HashMap with accounts
Account a = ...;
String key = ....;
accounts.put(key, a);
//首先创建HashMap
HashMap accounts=新的HashMap();
//然后用帐户填充HashMap
账户a=。。。;
字符串键=。。。。;
账目。放(钥匙,a);

严格地说,您可以通过制作HashMap并检查检索到的对象的类别来实现这一点。虽然这是一种容易出错且代码繁重的方法,但我强烈建议在设计中不要使用这种方法。如果您共享该目标,可能有更好的方法来实现您的目标

但是,如果您致力于此路径,则可以使用getClass().getName()或捕获ClassCastException来处理检索:

Map map = new HashMap();
map.put( "key", "string" );
map.put( account, object );
map.put( "transactions", transactionsMap );


Object string = map.get("key" );
String type = string.getClass().getName();
if( "java.lang.String".equals( type ) ) {
    System.out.println( "Retrieved "+string+" for key" );
}
Object account = new Object();

Object object = map.get( account );
System.out.println( "Retrieved "+object+" for account "+account );

Object transactionsObj = map.get( "transactions" );
try {
    Map transactions = (Map)transactionsObj;
    System.out.println( "Retrieved "+transactions+" for transactions" );
} catch( ClassCastException e ) {
    System.out.println( "Transactions was not a map "+e.getMessage() );
}

我很确定标题和术语是不正确的,所以请建议您的问题版本。为什么要使用
HashMap
?只需定义具有适当成员的数据类型即可。@SotiriosDelimanolis,您能详细说明吗?我理解这一点。但您如何将帐户和交易存储在同一个列表中?我的意思是,您如何处理当HashMap以值()的形式返回Account时的事务。只需在帐户中使用getter方法即可访问帐户的事务。例如:accounts.get(key).getTransactions()唯一的问题是显示事务,因为所有帐户的所有事务都同时显示,而不考虑HashMap中的键。就像所有帐户都有一个列表一样。当您构建一个帐户时,您需要设置一个仅包含该帐户事务的唯一列表。这样,您就创建了一个具有层次结构的HashMap您需要显示:key->account->transactions of the account这正是我试图通过将事务列表放置到account类中所做的。但它似乎不起作用。目标是能够创建帐户、添加事务并在控制台中显示这些事务。为什么您需要将它们放在单个映射中?可以吗您将它们分为两个映射,一个用于帐户,一个用于事务?这意味着您可以使用泛型使其类型安全。或者,如果事务属于某个帐户,则Alejandro Goñi的上述答案是一个更好的解决方案。如果您需要一次提取所有事务,则创建一个单独的列表来保存事务ns。我真的不必,我只是在学习Java并进行实验,看看实现类似于我所描述的结构的最有效的方法是什么。我只是确定这个结构使用起来非常舒适。这很公平……Alejandro的解决方案似乎更适合,将泛型与集合和POJO一起使用。小心同步如果数据在不同线程之间共享,您可能希望将集合包装在一个同步版本中以帮助保护它。他的版本很好,但当我显示交易时,他们显示的好像所有帐户都有一个列表。