-2

Javaでさまざまなデータ構造をコーディングしてインタビューの準備をしています。ただし、静的コンテキストでのジェネリック型に少し問題があります。ジェネリックパラメーターを受け取る静的である必要があるハッシュ関数がありますが、コンパイラーにはそれがありません。このエラーが発生している理由と、問題へのより適切なアプローチ方法に関するヘルプをいただければ幸いです。

public class Hashtable<K extends Comparable, T> {
    private int num_elem;
    private int num_buck;
    private ArrayList<LinkedList<Pair<K, T>>> buckets;

    private class Pair<K, T> {
        K key;
        T value;

        Pair(K key, T value) {
            this.key = key;
            this.value = value;
        }
    }

    public Hashtable(int size) {
        this.num_elem = size;
        this.num_buck = (int) (num_elem * 1.2);
        this.buckets = new ArrayList<LinkedList<Pair<K, T>>>();

        for (int i = 0; i < num_buck; i++)
            buckets.add(new LinkedList<Pair<K, T>>());
    }

    public static int hash(K key) {
        return (System.identityHashCode(key) * num_buck) / 97;
    }

    public static int compress(int hashval) {
        return hashval % num_buck;
    }

    public void add(K key, T value) {
        Pair p = new Pair<K, T>(key, value);
        int hashval = Hashtable.hash(key);
        buckets.get(Hashtable.compress(key)).add(p);
    }

    public T find(K key) throws exception {
        int hashval = Hashtable.hash(key);
        LinkedList<Pair<K, T>> ll = buckets.get(Hashtable.compress(hashval));

        Iterator iter = ll.iterator();

        while (iter.hasNext()) {
            Pair<K, T> p = iter.Next();

            if (p.key.compareTo(key) == 0)
                return p.value;
        }

        throw new Exception("Key not in HashTable");
    }

    public void remove(K key) {
    }

    public static void main(String[] args) {
    }
}
4

1 に答える 1

1

指摘されているよう}に、hashメソッドの終了がありません。ただし、静的メソッドはクラスの型パラメーターを参照できません。そうしないと、次のエラーが発生します。

non-static class K cannot be referenced from a static context

hashしかし、メソッドがジェネリックである必要があるようには見えません。Object代わりに次のようにするとうまくいくはずです:

public static int hash(Object key)
于 2013-03-07T01:36:45.373 に答える