如何使用方法作为结构创建Hashtable

时间:2016-08-31 13:32:31

标签: java hashtable

我的总体目标是用Hashtable填写员工数据,并能够访问/修改该数据然后将其打印出来。 鉴于我的Employee类,我可以像C中的结构一样使用它吗?我试图弄清楚如何初始化Hashtable并用这些数据填充它,但我对如何实现它感到困惑。

public class Employee {

    private String empName;
    private int empNum;
    private String empJob;

    public Employee(String empName, int empNum, String empJob)
    {
        this.empName = empName;
        this.empNum = empNum;
        this.empJob = empJob;

    }

    public int getEmpName()
    {
        return empName;
    }
    public String getEmpNum()
    {
        return empNum;
    }
    public String getEmpJob()
    {
        return empJob;
    }    
}

所以,我在main中尝试了这个,使用String作为键,所以我想使用名称作为键,以便您可以按名称搜索。我也尝试手动填充它,以便我可以测试一切。此外,我可以访问说,它上面的员工编号吗?如果是的话,我该怎么做?

    public class Main {

    public static void main(String[] args) 
    {
        Hashtable<String,Employee> EmployeeTable = new Hashtable<String,Employee>(); 
        Employee Object = new Employee("Donald","Donald", 3, "Engineer");
    }
}

先谢谢大家!

3 个答案:

答案 0 :(得分:2)

您可以使用put方法向Hashtable添加元素。您只需指定

然后,您可以使用get方法检索值并指定密钥。

示例用法:

Hashtable<String, Employee> table = new Hashtable<String, Employee>();
Employee bob = new Employee(...);
table.put("Bob", bob);

然后你可以说......

table.get("Bob");

这将为您返回Bob的Employee对象。

您的代码出现问题:

您应该注意您的代码存在一些问题。

1。您的员工构造函数错误。

您的Employee类中有Product的构造函数。这是非法的语法,不会编译(我希望)。相反,您应该使用Employee构造函数。

2。您的Hashtable变量名称与Object类匹配。

您已命名变量ObjectObject是所有java类继承的类,因此真的不应该为此命名(如果它甚至可以让你的话)。

Object documentation提到了这个......

  

Class Object是类层次结构的根。每个类都有Object作为超类。所有对象(包括数组)都实现此类的方法。

3。 Hashtable类型不正确。

您在Hashtable声明中添加了错误的类型。

你写了......

Hashtable<String, Employee> EmployeeTable = new Hashtable<String, Product>();

什么时候真的应该......

Hashtable<String, Employee> employeeTable = new Hashtable<String, Employee>();

(产品已更改为员工)
(我还将变量更改为小写)

注意:

  • 可以找到Hashtable的所有文档here

  • 您可能也有兴趣使用HashMap而不是Hashtable。它们几乎完全相同,但HashMap不是线程安全的。您可以看到一些差异here。如果您确实需要线程安全地图,那么我建议ConcurrentHashMap,由您决定哪一个最适合您。

    < / LI>
  • 变量名称的Java约定以小写字母开头。你没有 来遵循这个,但这绝对是一个好主意。如果你这样做,语法荧光笔将不再与你争论。

答案 1 :(得分:1)

您的班级有很多错误

示例:该类名为员工。然后构造函数必须使用该名称,而不是其他任何东西!

所以,它不应该读

public Product(String empName, int empNum, String empJob)

public Employee(String empName, int empNum, String empJob)

然后你的电话

Hashtable<String,Employee> EmployeeTable = new Hashtable<String,Product>();

可以正确写为

Hashtable<String,Employee> table = new Hashtable<>();

不, Hashtable 不是结构。哈希表是集合类;换句话说:它是一张地图。它映射一个键(在您的情况下为String)到Employee对象。

但是,stackoverflow不是其他人调试并向您解释代码的服务。所以,把我的输入作为起点;例如:开始阅读编译器消息。

答案 2 :(得分:1)

你想要达到的目的是:

// Create my Hashtable using the diamond notation indicating  to use the type arguments
// corresponding to the context which is <String, Employee> here
Map<String, Employee> EmployeeTable = new Hashtable<>();
Employee employee = new Employee("Donald", 3, "Engineer");
// put my employee into my map using empoyee's name as key
EmployeeTable.put(employee.getEmpName(), employee);

您要找的是Map#put(key, value)

在解决几个拼写错误问题后,您的班级员工应该是:

public class Employee {

    ...
    public Employee(String empName, int empNum, String empJob)
    {
        ...
    }

    public String getEmpName()
    {
        return empName;
    }
    public int getEmpNum()
    {
        return empNum;
    }
    ...
}

注意: Hashtable是一个过时的类,你不应该再使用它了,如果你不打算分享它,请使用HashMap而不是你想要的分享使用ConcurrentHashMap