如何调用枚举函数?

时间:2017-03-20 14:13:27

标签: java hashmap

我有以下问题。我正在尝试在java中实现一个HashMap,但它必须在教授的术语上完成。他写了一个方法大纲,以及它们应该如何看待,所以我不能改变除了写入add(key,value)函数之外的任何其他东西。

public static enum HashingMethod {
        DivisionMethod,
        KnuthMethod
    };

DivisionMethod和KnuthMethod都是HashFunction类中哈希的函数。 如果有人要使用这个程序,他首先会创建一个HashMap类的实例:
HashMap hm = new HashMap(6, HashFunction.HashingMethod.DivisionMethod);

然后使用hm.add(3, "Ambulance")向其中添加元素。

这是HashMap的构造函数:

public HashMap(int m, HashFunction.HashingMethod h) {
        this.h = h;
        this.table = new LinkedList[m];
        for (int i=0; i<table.length; i++) {
            table[i] = new LinkedList<Element>();
        }
    }

我想知道的可能是基本的,但它一直让我不能进步很长一段时间。

我如何知道选择了哪种哈希函数,以便我可以在add(key, value)方法中使用它?

3 个答案:

答案 0 :(得分:4)

我会在枚举中添加一个抽象方法,因此不需要ifswitch

public static enum HashingMethod {
    DivisionMethod {
        @Override
        public int calcHash(Object o) {
            // do it
        }
    },
    KnuthMethod {
        @Override
        public int calcHash(Object o) {
            // do it
        }
    };

    public abstract int calcHash(Object o);
}

所以你可以直接调用enum-method

int bucket = this.h.calcHash(e);

答案 1 :(得分:2)

您可以简单地切换它:

switch(this.h) {
    case DivisionMethod: /*code*/; break;
    case KnuthMethod: /*code*/; break;
}

答案 2 :(得分:1)

您似乎将HashingMethod存储在名为h的字段中。

要检查所选方法,请执行以下操作:

if (h == HashFunction.HashingMethod.DivisionMethod) {

    // use division method

}