【问题标题】:Java: Effeciently keep track of used objectsJava:有效地跟踪使用过的对象
【发布时间】:2012-02-04 07:08:47
【问题描述】:

我有一个随时间收集对象的程序。这些对象通常是程序已经接收到的对象的副本,但并不总是重复。独特对象的数量有时会达到数万。随着我的列表越来越多,需要更多时间来确定一个对象之前是否出现过。

我目前的方法是将所有内容存储在 ArrayList 中,al;使用 Collections.sort(al);并使用 Collections.binarySearch(al, key) 来确定我是否使用过一个对象。但是,每次遇到新对象时,我都必须插入和排序。

我想知道是否有更好的方法来做到这一点。包含往往会过快地减速。我正在寻找尽可能接近 O(1) 的东西。

非常感谢。

这是java。为了理解我在说什么,我基本上需要一个方法来做到这一点:

public boolean objectAlreadyUsed(Object o) {
  return \\ Have we seen this object already?

}

【问题讨论】:

  • 你可以只使用 HashSet 或 HashMap 而不是 ArrayList。

标签: java search sorting duplicates


【解决方案1】:

确保对象具有正确的equals()hashCode() 方法,并将它们存储在HashSet 中。然后查找就变成了常数时间。

如果保留不需要的对象成为问题,顺便说一句,您可以考虑使用 Internet 上可用的众多 WeakHashSet 实现之一——它将保存对象,但仍允许在必要时对它们进行垃圾回收。

【讨论】:

  • 这次我确实需要保留所有对象,这对我吐出的数据很重要,但很高兴知道。你学了这么多,你认为你知道关于 Java 的一切……但你不知道。 :)
【解决方案2】:

为什么不使用ArrayList,而不是使用Set 实现(可能是HashSet)?你会得到constant-time lookup,不需要排序。

注意您的对象需要correctly override hashCode() and equals()

【讨论】:

  • 我查了 hashList。 :( \\ 认为它是 HashSet。谢谢...尝试一下。
  • 我可以在几分钟内接受这个。工作完美。幸运的是,这次我的对象是字符串,所以不需要额外的实现...... **等待点击打勾......
【解决方案3】:

这引出了一个问题——为什么不使用不允许重复的数据结构(例如Set)?如果您尝试 add 重复项,该方法将返回 false 并且数据结构将保持不变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2013-06-10
    相关资源
    最近更新 更多