有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java树结构中的HashMap

我正在寻找一个基本上像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),然后使用comparator(如上所述比较值)再次排序。我可以用什么来满足我的需要


共 (1) 个答案

  1. # 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类库中同样没有这样的数据结构

    在这种情况下,如果需要生成的Map完全符合API约定,那么包装HashMapTreeMap将非常复杂

    所以我建议您只使用一个HashMap和键/值对的树集。。。并手动使其保持同步