具有多个值的键

时间:2014-03-07 12:04:32

标签: java hashmap hashtable

我正在做一个大学项目,我有一个关键的多个值。这是我的代码

import  java.util.Hashtable;

private Hashtable name2email;
name2email = new Hashtable();

@Override
public void record_user(String name, String email, String address, String phonenumber, double accountnumber, double credit) throws user_exists {
    if (name2email.containsKey(name)||    
        name2email.contains(email)||
        name2email.contains(address)||
        name2email.contains(phonenumber)||
        name2email.contains(credit)||
        name2email.contains(accountnumber)) 
    {
        throw new user_exists();
    }
    name2email.put(name, email,address,accountnumber,phonenumber,credit);
}

由于我的任务规格,我使用的是HashTable。有什么建议?是的,这是我要回来的错误

 no suitable method found for put(String,String,String,double,String,double)
    method Hashtable.put(Object,Object) is not applicable
      (actual and formal argument lists differ in length)

我该怎么办?

3 个答案:

答案 0 :(得分:6)

创建一个包含所有这些值的类,实例化此对象并将用户名映射到这些“用户详细信息”对象。

答案 1 :(得分:1)

创建一个User类(即域对象),其中包含:

  • 关于用户(姓名,电话等)的每个数据项的字段(即成员变量)
  • 重写的hashCode()方法,它根据表示用户身份的数据项计算哈希值(两个用户可以使用相同的名称吗?相同的电话号码?)
  • 重写的equals()方法,它实现与hashCode()相同的身份。

通常,如果您使用自己的类作为Map键,那么您要考虑默认(即java.lang.Object)hashcode()/ equals()方法是否符合您的要求(即定义标识)正确。

正确实现hashCode()和equals()并非易事 - 请仔细阅读这些方法的java.lang.Object API文档。一个体面的IDE会为你实现hashCode()和equals(),如果你告诉它哪些字段来计算它们,这通常比滚动你自己更安全。

然后使用HashMap将用户映射到电子邮件地址。 (为什么电子邮件地址不是用户的成员?如果用户有多个电子邮件地址怎么办?)

(首选HashMap到Hashtable。如果你需要一个线程安全的Map,那么使用ConcurrentHashMap或Collections.synchronizedMap()。)

答案 2 :(得分:0)

哈希表使用键值对。

显然

 name2email.put(name, email,address,accountnumber,phonenumber,credit);

违反了Hashtable put语法。相反,你需要做这样的事情

name2email.put(name,new User(name,email,address,accountnumber,phonenumber,credit);

你的name2email定义应该是这样的:

Hashtable<String,User> name2email= new Hashtable<String,User>();

检查是否存在您需要执行的记录:

 User u = name2email.get(name);
 if(u.getName().equals(name) || u.getEmail().equals(email)...(rest of your logic).
  { ...your user exists 
  }
  else put(name,new User(name,email,address,accountnumber,phonenumber,credit);