我基本上需要一个像Set
一样工作的数据结构,但这不仅维护了插入顺序,让我稍后通过get(index)
方法获取它们。 / p>
最适合实现此目的的数据结构是什么?如果需要,我不会有必须实施一个问题。在更糟糕的情况下,我可以同时使用ArrayList和HashSet,但我想知道是否有专门的数据结构直到任务。
性能至关重要(否则我只能在常规列表上进行O(n)
搜索!)我并不担心空间复杂性。
答案 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();
}
}