为没有键的Map实现entrySet

时间:2012-07-19 14:58:39

标签: java map

我写了一个TrieMap<V> implements Map<String,V>类,显然是从字符串中键入来的。这很好用。

我希望将其增强为与更通用的CharSequence相关联。我相信除了最后一个问题我已经设法实现了转换,我无法创建K类型的对象。

现在签名必须变为TrieMap<K extends CharSequence,V> implements Map<K,V>。问题是,我相信你知道,TrieMap实际上并不存储原始密钥。 (事实上​​,这是它的主要价值之一,因此它通常比普通地图占用更少的空间。)

要实现Set<Entry<K, V>> entrySet(),我必须以某种方式制造K类型的对象。有什么办法可以实现吗?

2 个答案:

答案 0 :(得分:3)

我将定义以下界面:

public interface KeyBuilder<K extends CharSequence> {
    public K build(CharSequence value);
}

并提供TrieMap构造函数的接口实现。当您需要构建新的K实例时,请求接口执行此操作。

您可能会使用更适合您的数据结构的东西作为build方法的参数,CharSequence只是一种可能性。如果你想做一些更复杂的事情,你可以像这样构建它:

public interface KeyFactory<K extends CharSequence> {
    public KeyBuilder<K> newBuilder();
}

public interface KeySequence<K extends CharSequence> {
    public KeySequence<K> append(char value);
    public K build();
}

String实施:

public class StringKeyFactory<String> {
    public KeyBuilder<String> newBuilder() {
        return new KeyBuilder<String>() {
            private final StringBuilder s = new StringBuilder();
            public KeySequence<String> append(char value) {
                s.append(value);
                return this;
            }
            public String build() {
                return s.toString();
            }
        };
    }
}

答案 1 :(得分:0)

不,我不知道如果不在构造函数中使用Factory<K>作为参数,它将如何成为可能。此Factory<K>将负责根据您在K中的元素创建TrieMap的实例。