【发布时间】:2015-09-21 10:55:17
【问题描述】:
我正在尝试实现一个排序的哈希映射,但我遇到了一个问题。让我先描述一下情况,以便人们了解发生了什么。
我定义了一个名为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> 的红黑树?
【问题讨论】:
-
TreeMap有什么问题?而且 - 顺便说一下 - 没有像 排序的哈希映射这样的数据结构。 -
你能修改
RedBlackBST类,使contains方法只接受一个键吗? -
@Seelenvirtuose 是的,我知道没有排序的哈希映射,因为哈希映射使用数组作为底层存储系统。
TreeMap没有任何问题,但就我而言,我想从头开始实现自己的排序地图。 -
@DanilGaponov 不幸的是我不能。我在
RedBlackBST中的contains()方法接受T,即Item<K, V>。这是我的全部class -
@RenatKaitmazov 如果您希望能够测试存储中的特定密钥,则必须实现这样的方法。您也可以尝试使用您的键和任何值来测试一个项目,在这种情况下您的比较器应该返回 0。
标签: java generics data-structures hashmap