【问题标题】:Problems with implementing a sorted map实现排序地图的问题
【发布时间】: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&lt;K, V&gt;),而该节点本身又存储另外两项。

public final class RedBlackBST<T extends Comparable<T>> {
private Node<T> root;
.........
// All the rest of it
}

众所周知,地图不能有重复的键,所以在我的 insert() 方法中,我首先必须检查它是否已经包含该键,当我将此任务委托给我的红黑 BST storage.contains() 我不能只传递一个密钥,我必须传递Item。这就是问题出现的地方。 有没有办法解决这个问题,而无需创建另一棵可能类似于 Tree&lt;K, V&gt; 的红黑树?

【问题讨论】:

  • TreeMap 有什么问题?而且 - 顺便说一下 - 没有像 排序的哈希映射这样的数据结构。
  • 你能修改RedBlackBST类,使contains方法只接受一个键吗?
  • @Seelenvirtuose 是的,我知道没有排序的哈希映射,因为哈希映射使用数组作为底层存储系统。 TreeMap 没有任何问题,但就我而言,我想从头开始实现自己的排序地图。
  • @DanilGaponov 不幸的是我不能。我在RedBlackBST 中的contains() 方法接受T,即Item&lt;K, V&gt;。这是我的全部class
  • @RenatKaitmazov 如果您希望能够测试存储中的特定密钥,则必须实现这样的方法。您也可以尝试使用您的键和任何值来测试一个项目,在这种情况下您的比较器应该返回 0。

标签: java generics data-structures hashmap


【解决方案1】:

Map 确实不能有重复的密钥,但您不必在 insert() 中调用 contains()。实际上在 JDK 中,insert() 等效方法 - put() 的行为是,如果密钥已经存在,则将其替换为新密钥。 所以你可以做的是假设密钥是唯一的和新的,然后继续插入它。如果以某种方式在您要存储的地方发现密钥已经存在,那么您可以替换相应的值;或者您可以抛出异常,这取决于您想要的行为。

JDK 中已经有一个SortedMap 接口和一个基于红黑树实现的TreeMap

【讨论】:

  • 如果特定键已经在storage 中,我希望insert() 方法用新值替换旧值,就像JDK TreeMap 那样。但到目前为止我还没有想出解决方案。
猜你喜欢
  • 2013-01-16
  • 1970-01-01
  • 2016-10-02
  • 2018-09-20
  • 2011-11-03
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 2019-07-05
相关资源
最近更新 更多