一个维护插入顺序并允许按索引访问元素的集合

时间:2012-02-24 18:44:52

标签: c# java data-structures set

我基本上需要一个像Set一样工作的数据结构,但这不仅维护了插入顺序,让我稍后通过get(index)方法获取它们。 / p>

最适合实现此目的的数据结构是什么?如果需要,我不会有必须实施一个问题。在更糟糕的情况下,我可以同时使用ArrayList和HashSet,但我想知道是否有专门的数据结构直到任务。

性能至关重要(否则我只能在常规列表上进行O(n)搜索!)我并不担心空间复杂性。

3 个答案:

答案 0 :(得分:4)

OrderedDictionary怎么样?

  

表示可以访问的键/值对的集合   密钥或索引。

http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx

答案 1 :(得分:1)

您是否愿意使用现有代码? Apache Commons有一个ListOrderedSet类,似乎符合您的所有要求。最糟糕的是,您可以研究源代码并在C#中实现。

答案 2 :(得分:1)

这样的东西? 修改:正如Jiddo所说,此结构无法有效地删除元素。如果不需要有效的删除,则ArrayList + Set更简单,因此这种结构实际上并不是很好。

import java.util.*;

public class ArraySet<T> {
    private final Map<Integer, T> indexToElem;
    private final Map<T, Integer> elemToIndex;

    public ArraySet() {
        indexToElem = new HashMap<Integer, T>();
        elemToIndex = new HashMap<T, Integer>();
    }

    public T get(int index) {
        if (index < 0 || index >= size())
            throw new IndexOutOfBoundsException();
        return indexToElem.get(index);
    }

    public void add(T elem) {
        if (!contains(elem)) {
            int index = indexToElem.size();
            indexToElem.put(index, elem);
            elemToIndex.put(elem, index);
        }
    }

    // Doesn't work; see comment.
    /*public void remove(T elem) {
        int index = elemToIndex.get(elem);
        indexToElem.remove(index);
        elemToIndex.remove(elem);
    }*/

    public boolean contains(T elem) {
        return elemToIndex.containsKey(elem);
    }

    public int size() {
        return indexToElem.size();
    }
}