是否有任何数据结构提供快速键/值访问,但这也是有序的,可以通过位置索引访问?

时间:2014-10-15 19:15:46

标签: java data-structures key-value

基本上,我需要像TreeMap这样的东西,但这样我就可以有效地将元素放在X位置。

4 个答案:

答案 0 :(得分:2)

您可以使用ListOrderedMap中的Apache Commons Collections

它为您提供get(int index)方法,以便在通常的index方法之上检索位置Map上的密钥。

答案 1 :(得分:1)

平衡树可以按键和索引用于查找,在O(log N)时间内,如果存储" size"每个节点中的字段,用于跟踪节点所有后代中包含的键/值对的数量。

通过索引查找值的代码看起来像这样(在伪代码中):

 def at(index)
   if index == this.left.size
     return this.value
   else if index < this.left.size
     return this.left.at(index)
   else
     return this.right.at(index - this.left.size - 1)

答案 2 :(得分:0)

TreeMap得到的复杂性是O(log n) 我想这不是性能问题。 另外我知道数组有O(1),但你的要求与树图匹配。

使用TreeMap的SortedMap接口适合您:)。

答案 3 :(得分:0)

组合一些数据结构来提供这一点并不困难。假设没有重复,那么下面的草图可以工作。如果你确实需要支持重复项,那么使用像默认Object类那样提供唯一哈希的东西包装你的对象。

我不知道你想如何使用位置数据,所以我没有添加任何与重新排序或迭代有关的方法,但这并不困难。听起来像Apaches ListOrderedMap也是一个不错的选择。

public class OrderedMap<K, V>{
        private ArrayList<V> values;
        private HashMap<K, V> map;
        private HashMap<K, Integer> keysToIndices;

        public OrderedMap(){
                values = new ArrayList<>();
                map = new HashMap<>();
                keysToIndices = new HashMap<>();
        }

        public void put(K key, V value){
                values.add(value);
                map.put(key, value);
                keysToIndices.put(key, values.size()-1);
        }
        public T get(K key){
                return map.get(key);
        }

        public V remove(K key){
                map.remove(key);
                return values.remove(keysToIndices.remove(key))
        }
}