【问题标题】:Key with multiple values具有多个值的键
【发布时间】:2014-03-07 12:04:31
【问题描述】:

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

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)

我该怎么办?

【问题讨论】:

  • Hashtable 已过时 - 您可以改用 HashMap。

标签: java hashmap hashtable


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    创建一个用户类(即域对象),其中:

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

    一般来说,如果您使用自己的类作为 Map 键,那么您需要考虑默认(即 java.lang.Object)hashcode()/equals() 方法是否符合您的要求(即定义身份)正确。

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

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

    (首选 HashMap 而非 Hashtable。如果您需要线程安全的 Map,请使用 ConcurrentHashMap 或 Collections.synchronizedMap()。)

    【讨论】:

      【解决方案3】:

      哈希表适用于键值对。

      很明显

       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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-17
        • 2015-10-02
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-17
        相关资源
        最近更新 更多