快速包含和LIFO数据结构

时间:2012-10-10 17:17:05

标签: java

我在java中寻找一个具有快速contains()方法的数据结构,但可能需要某种排序,因为我需要能够添加它并从中获取,但我希望它是就像具有LIFO功能的堆栈一样。这可能吗?我想到了一个HashSet,它有快速contains()但它没有保证的排序,而LinkedList保证了有序但缓慢的包含()。

2 个答案:

答案 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);
   }
}