基本上,我需要像TreeMap这样的东西,但这样我就可以有效地将元素放在X位置。
答案 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))
}
}