如何使用方法作为结构创建哈希表

How to create a Hashtable using a method as a struct

我的总体目标是用员工数据填充 Hashtable 并能够 access/modify 该数据然后打印出来。 鉴于我的 Employee class 在这里,我可以像 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");
    }
}

先谢谢大家了!

你的class有很多错误

示例:class 称为 Employee。然后构造函数必须使用该名称,而不是其他名称!

所以,它不应该是

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 不是结构。哈希表是一个集合 class;换句话说:它是一张地图。它映射一个键(在你的例子中是字符串)到员工对象。

但是,好吧,Whosebug 不是供其他人调试和解释您的代码的服务。所以,以我的意见为起点;例如:开始阅读编译器消息。

你想要实现的是:

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

修正几个拼写错误后,您的 class 员工应该是:

public class Employee {

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

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

注意: Hashtable 是一个过时的 class,你不应该再使用它,如果你不打算分享它使用 HashMap instead and if you want to share it use a ConcurrentHashMap

您可以使用 put 方法将元素添加到哈希表中。您只需要指定 keyvalue.

然后您可以使用 get 方法并指定键来检索值。

用法示例:

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

然后你可以说...

table.get("Bob");

这将为您 return Bob 的员工对象。

您的代码有问题:

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

1。你的 Employee Constructor 是错误的。

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

2。您的 Hashtable 变量名称与对象匹配 class.

您已将变量命名为 ObjectObject 是所有 java class 继承自的 class,所以你 真的 不应该这样命名(如果它甚至可以让你。

Object documentation提到这个...

Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class.

3。哈希表类型不正确。

您在哈希表声明中输入了错误的类型。

您写了...

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

什么时候真的应该...

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

(产品改为员工)
(我也把变量改成了小写)

备注:

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

  • 您可能也对使用 HashMap instead of a Hashtable. They're almost identical but HashMap isn't threadsafe. You can see some of the differences here. If you really need a threadsafe map then I'd recommend ConcurrentHashMap 感兴趣,不过您可以自行决定哪一个最适合您。

  • Java 约定变量名称以小写字母开头。您 不必 遵循此操作,但这绝对是个好主意。如果你这样做,语法高亮器将不再与你争论。