Java中的树结构中的HashMap

时间:2014-03-23 05:26:33

标签: java tree hashmap containers treemap

我正在寻找一个基本上像HashMap那样工作的容器,我可以在O(1)时间放置并获取任何条目。我也希望能够迭代,但我想按顺序对订单进行排序。因此TreeMapLinkedHashMap都不适合我。我找到了以下示例:

SortedSet<Map.Entry<String, Double>> sortedSet = new TreeSet<Map.Entry<String, Double>>(
        new Comparator<Map.Entry<String, Double>>() {
            @Override
            public int compare(Map.Entry<String, Double> e1,
                    Map.Entry<String, Double> e2) {
                return e1.getValue().compareTo(e2.getValue());
            }});

问题是SortedSet没有获取条目的get方法。 我将在我将添加条目的地方使用此集合,但是在已经存在条目的情况下,将更新值(double),然后使用比较器(比较上面提到的值)再次对其进行排序。我能用什么来满足我的需求?

1 个答案:

答案 0 :(得分:1)

Java类库中没有这样的数据结构。

但是你可以创建一个私有HashMap的包装器和一个具有相同键/值对的私有TreeMap。

这提供了get复杂度为O(1)的数据结构,如常规HashMap(但不是put或其他更新操作),以及密钥集和条目设置可以按关键顺序迭代...按照本课题原始版本的要求。


这是一个开始:

public class HybridMap<K,V> implements Map<K,V> {
    private HashMap<K,V> hashmap = ...
    private TreeMap<K,V> treemap = ...

    @Override V get(K key) {
        return hashmap.get(key);
    }

    @Override void (K key, V value) {
        hashmap.put(key, value);
        treemap.put(key, value);
    }

    // etcetera
}

显然,我只实现了一些(简单)方法。


如果您希望能够按值顺序(而不是键顺序)迭代条目,那么Java类库中就没有这样的数据结构。

在这种情况下,如果您需要生成的HashMap完全符合API合同,那么换行TreeMapMap会非常复杂。

所以我建议您只使用键/值对的HashMap和TreeSet ...并手动将它们保持在步骤中。