【问题标题】:Fastest way to search collection in java在java中搜索集合的最快方法
【发布时间】:2014-10-03 12:06:45
【问题描述】:

我参加了一个项目,但我很难继续下去。没有 cmets、未记录的代码、不一致的命名变量等。

但是,在某些时候我过期了搜索的缓慢执行。老实说,我从未在我开发的移动应用程序上过早过期,因为没有太多数据需要处理。

好的,有一个 A 类,其中包含以下字段:

  • ID 整数
  • 信息 1 字符串
  • 信息 2 字符串
  • ...字符串

在会话期间,类 A 的集合正在填充新实例。在某些时候,用户要求选择实例 ID 的实例信息(集合不按 ID 以任何顺序排序)。平均而言,大约有 2500 个实例 在一些较旧的设备上需要很长时间才能找到它。 什么是尽可能快地做到这一点的最佳做法? (附时间复杂度说明)

把他的代码留给我的精灵把它全部放在一个集合中并通过线性搜索进行搜索。

  1. 堆排序,所以可以通过二分查找多次查找?
  2. 按排序顺序添加,然后使用二分查找?
  3. 将数据放入 SQLite 临时表(了解更多数据)并按查询搜索
  4. HashSet 或 TreeSet
  5. 别的东西..

【问题讨论】:

    标签: java android performance sorting search


    【解决方案1】:

    如果您通过键搜索集合,您通常应该使用 HashMap,它在预期的 O(1) 时间内根据它们的键在地图中查找项目。

    但是,如果标识符是数字且连续的(即它们从 0 到 2500 没有间隙),您可以使用 ArrayList,您可以在其中通过其索引在O(1) 时间访问项目。如果标识符是数字且连续的,并且绑定了项目数,则根本不需要 Collection。一个数组就可以了。

    【讨论】:

    • 答案的第一部分适合我的情况。如果我使用微调器和“名称”字符串而不是在微调器中显示 ID 怎么办?您能提出解决方案吗?
    • @StevanPopov 一种选择是拥有两个 HashMap,一个以 ID 作为键,另一个以 name 作为键。另一种选择是只有一个以 ID 为键的地图,在 Spinner 中,您将区分显示的值(名称)和实际值(ID) - 我假设存在这样的区别(我不熟悉微调器类)。当一个项目被选中时,你可以通过它的 ID 在 HashMap 中搜索它。
    • 你的意思是stackoverflow.com/questions/1625249/…?我们会假设自定义适配器有效地搜索对象吗?
    • @StevanPopov 你肯定不会在微调器中显示超过几十个项目,是吗?对于这么少的项目,线性搜索就足够了。
    • @maaartinus 我宁愿使用两个 HashMap,而不是让我的代码搜索线性。您对在微调器中获取选定字符串(对象)的其他值有一些参考吗?你知道它会线性搜索吗?
    【解决方案2】:

    我会说这取决于您需要对这个集合进行什么样的操作。如果您仅按 ID 搜索元素,则 HashMap 可能是一个很好的解决方案(所有基本操作的恒定时间复杂度)。如果您需要对元素进行排序,您可能更喜欢 TreeSet(O(log(n)) 复杂度用于添加、查找、删除等基本操作但有序的数据结构)。

    如果您需要根据其他条件进行搜索,您可以考虑使用数据库。

    【讨论】:

      【解决方案3】:

      集合中的ArrayList和Vector实现了随机访问接口,是搜索操作的最佳解决方案。如果您使用 ID 作为键,则可以使用 HashMap

      【讨论】:

        猜你喜欢
        • 2014-02-18
        • 2012-08-28
        • 2017-03-17
        • 2011-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        • 2011-08-25
        相关资源
        最近更新 更多