我正在尝试实现已排序的哈希映射,但我遇到了一个问题。让我先描述一下情况,以便人们了解正在发生的事情。
我定义了一个名为Map
的接口。看起来像这样
public interface Map<K extends Comparable<K>, V> {
/*** STATE INFORMATION ***/
public boolean isEmpty();
public int size();
public boolean contains(K key);
/*** MAIN OPERATIONS ***/
public void insert(K key, V value);
public V get(K key);
public V delete(K key);
}
我还定义了一个名为SortedMap
的类来实现这个接口。在这个类中,我有一个名为Item
的嵌套静态类,它充当包装器。这是
private static class Item<K extends Comparable<K>, V> implements Comparable<Item<K, V>> {
private K key;
private V value;
Item(K key, V value) {
this.key = key;
this.value = value;
}
@Override
public String toString() { return String.format("%s=%s", key.toString(), value.toString()); }
public int compareTo(Item<K, V> item) {
if (key.compareTo(item.key) > 0) return 1;
else if (key.compareTo(item.key) < 0) return -1;
else return 0;
}
}
为了存储这个类的对象,我使用红黑BST作为底层存储系统。
private RedBlackBST<Item<K, V>> storage = new RedBlackBST<>();
我的红黑BST每个节点只能存储一个项目(在这种情况下为Item<K, V>
),每个节点本身存储另外两个项目。
public final class RedBlackBST<T extends Comparable<T>> {
private Node<T> root;
.........
// All the rest of it
}
大家都知道地图不能有重复的密钥,所以在我的insert()
方法中我首先要检查它是否已包含该密钥,以及何时将此任务委托给我的红黑BST storage.contains()
我不能只传递密钥,我必须通过Item
。这就是出现问题的地方。
有没有办法解决这个问题而不创建另一个看起来像这个Tree<K, V>
的红黑树?
答案 0 :(得分:0)
Map
确实没有重复密钥,但您不必在contains()
中致电insert()
。实际上在JDK中,insert()
等效方法 - put()
的行为是,如果密钥已经存在,则将其替换为新密钥。
所以你可以做的是假设密钥是唯一的和新的,然后继续插入它。如果在某个地方你想要存储,你发现一个密钥已经存在,那么你可以替换相应的值;或者你可以抛出异常,取决于你想要的行为。
JDK中已经存在SortedMap
接口,而TreeMap
的实现基于红黑树。