【问题标题】:Collection with index and hash access具有索引和哈希访问的集合
【发布时间】:2013-02-08 01:04:32
【问题描述】:

我需要一个集合类,它同时具有:快速索引和散列访问。 现在我有 ArrayList。它具有良好的索引访问权限,但他的 contains 方法性能不佳。 HashSet 有很好的contains 实现,但没有索引访问。哪个系列两者兼备?可能来自 Apache 的东西? 或者我应该创建自己的集合类,它同时具有:用于索引访问的 ArrayList 和用于contains 检查的 HashSet?

澄清一下:我需要get(int index)contains(Object o)

【问题讨论】:

  • 你自己的数据结构包含两者(或一些变体)可能是要走的路。
  • 你能解释一下为什么你想要这个吗?
  • 是的,我可以。我有遗留代码,它几乎使用了 List 对象 (ArrayList) 的所有方法。我没有机会重写它,但我想提高它的性能。这里的主要问题是 contains 和 indexOf 方法,因为它们具有线性性能。

标签: java collections contains hashcode


【解决方案1】:

如果索引访问性能不是问题,则最接近的匹配是 LinkedHashSet,其 API 表明它是

Set接口的哈希表和链表实现,迭代顺序可预测。

至少我不认为性能会比LinkedListPerformance差。否则,除了您的 ArrayList + HashTable 解决方案,我别无选择

【讨论】:

  • 我不确定它真的更好
【解决方案2】:

如果您是从头到尾遍历索引,我认为这可能会满足您的需求:LinkedHashSet

如果您需要通过索引随机访问,以及哈希访问,如果没有其他人有更好的建议,我想您可以制作自己的集合,两者兼而有之。

【讨论】:

  • 据我所知,索引访问将是O(n),这不是特别有效。
  • LinkedHashSet 没有方法 'get(int index)'
  • @SergiyMedvynskyy 是的,但是你可以使用迭代器来模拟它。
  • 当然可以,但在这种情况下,我将在另一个地方遇到同样的性能瓶颈。
【解决方案3】:

这样做;结合使用 Hash 技术以及 list 来获得两全其美 :)

class DataStructure<Integer>{
   Hash<Integer,Integer> hash = new HashMap<Integer, Integer>();
   List<Integer> list = new ArrayList<Integer>();

    public void add(Integer i){
        hash.add(i,i);
        list.add(i);
    }
    public Integer get(int index){
        return list.get(index);
    }
   ...
} //used Integers to make it simpler

所以反对;您保留在 HashMap/HashSet 以及 ArrayList 中。

所以如果你想使用

 contains method : call hashed contains method.

 get an object with index: use array to return the value

只要确保这两个集合同步即可。并注意两种数据结构的更新/删除。

【讨论】:

  • 这是最后一个漏洞,如果我找不到更好的东西,我会使用它
【解决方案4】:

我不知道确切的查找时间,但也许您可以使用Map interface 的一些实现。您可以使用map.put(objectHash, obj) 存储您的对象。

然后你可以验证你有一个特定的对象:

boolean contained = map.containsValue(obj);

您可以使用哈希在地图中查找对象:

MyObject object = map.get(objectHash);

不过,唯一的缺点是您需要知道此查找调用中的哈希值,这可能不在您的实现中。

【讨论】:

  • containsValue for HashMap 具有与包含列表相同的性能 - 线性。我希望是对数(当然如果可能的话)。
  • @SergiyMedvynskyy 啊,我不知道。你有在哪里找到的参考吗?
  • 简单看HashMap的实现。方法 containsValue 迭代所有条目并检查是否相等,如 ArrayList 的 contains 方法。
猜你喜欢
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2014-05-06
  • 2011-11-27
  • 2020-11-10
  • 2017-10-31
相关资源
最近更新 更多