我在java中寻找一个具有快速contains()方法的数据结构,但可能需要某种排序,因为我需要能够添加它并从中获取,但我希望它是就像具有LIFO功能的堆栈一样。这可能吗?我想到了一个HashSet,它有快速contains()但它没有保证的排序,而LinkedList保证了有序但缓慢的包含()。
答案 0 :(得分:3)
嗯,如果您需要进行LIFO堆栈操作,则无法对集合进行排序,因为这样就会丢失将项目添加到集合中的顺序。
坦率地说,最简单的方法就是创建两个并行结构,比如创建一个Stack和一个HashMap。将它们包含在一个更大的类中,该类添加和删除始终添加/删除的功能。然后你可以使用堆栈来进行推送和弹出,并使用HashMap来完成你的包含。通常我讨厌创建重复数据,但我看到做你想做的唯一方法就是拥有一个“索引堆栈”,这几乎就是我建议的方法。
我强调将它包装在一个执行添加和删除的类中,并确保所有添加和删除都通过该类。否则,如果您的代码执行了添加/删除全部分散,则可能会导致两个结构不同步。通过一个类强制它,你只需要调试那个部分一次。
答案 1 :(得分:2)
LinkedHashSet()
让你部分到达那里,但遗憾的是没有提供一个很好的方法来移除LIFO。
我认为你想要的是包裹LinkedList<T>
(用于移除LIFO)和HashMap<T, Integer>
(用于跟踪基数)的内容。然后你会有这些方法(非常粗略):
public class QuickCheckStack<T> {
private final Map<T, Integer> elementCardinality = new HashMap<T, Integer>;
private final Deque<T> stack = new LinkedList<T>();
public void push(T element) {
Integer count = elementCardinality.get(element);
if (count == null) {
count = 0;
}
elementCardinality.put(element, count + 1);
stack.push(element);
}
public T pop() {
T element = stack.pop();
elementCardinality.put(element, elementCardinality.get(element) - 1);
return element;
}
public boolean contains(T element) {
Integer count = elementCardinality.get(element);
return count != null && !count.equals(0);
}
}