3

背景

对于课堂,我制作了一个线性链接哈希表。它存储一个链表数组,每当调用 get 或 put 时,键都会被散列并以数组大小取模。然后在生成的链表(我也实现了)上调用 get 或 put。

我有一个ST(符号表)界面。它很像Map,但一些Map必需的操作对我来说太混乱了,无法实现。实现这个接口,我实现了链表、红黑树、线性探测哈希表和线性链接哈希表。

我想做一个类似于接受任意委托符号表类型的线性链接哈希表的东西。例如,使用红黑树类型对其进行初始化将创建一个红黑树表,而 get 和 put 函数将委托给这些红黑树。

我认识到我的实现几乎肯定比库提供的慢,而且我最好在实际代码中使用它们。我只是在尝试和学习。

问题

向我的哈希表提供类型的最佳方法是什么,以便哈希表将包含该类型的表,并且调用将委托给这些符号表?

我不能使用泛型,因为我无法初始化它们,我需要在构造和重新调整大小时进行初始化。

我考虑过提供一个所需类型的空白符号表来启动,然后使用该copy方法,但似乎应该有更好的方法。在那儿?

4

2 回答 2

4

您可能Factory还需要提供一个来创建所需支持结构的实例。

一个简单的例子,其中 aMap委托给 another Map

public static interface Supplier<T> {

    T get();
}

public static class DelegatingMap<K, V> implements Map<K, V> {

    private final Map<K, V> backingMap;

    public DelegatingMap(final Supplier<Map<K, V>> backingMapSupplier) {
        backingMap = backingMapSupplier.get();
    }

    @Override
    public int size() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public boolean isEmpty() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    //etc...
}
于 2013-03-24T16:59:09.980 回答
2

由于类型擦除,在运行时对象不会自动跟踪它们的类型参数,这就是new T()不编译的原因。

您可以通过要求调用者为您提供Class类型参数的对象来解决此问题,然后您可以使用它来创建新实例。当然,使用反射绕过编译时检查(特别是,编译器不会检查符号表实现是否具有所需的构造函数),以及您的 IDE 可能提供的任何静态分析(构造函数上的调用层次结构不会显示任何来电者)。

或者,您可以要求调用者为您提供工厂对象,该对象可以按需创建符号表实现。这更灵活(例如,调用者可以选择构造函数参数)和静态类型安全,但也更冗长......

于 2013-03-24T17:03:54.360 回答