【问题标题】:Efficiency of JList SearchJList 搜索的效率
【发布时间】:2012-02-13 16:02:52
【问题描述】:

我遇到了一些用于在 JList 上进行前缀搜索的 java 代码。然而,仔细观察它,算法的核心是非常低效的,它对每个按键使用列表的线性搜索,并在紧密循环中进行慢速大小写转换。

我想对于非常大量的数据,自定义实现的三元搜索树将是一个更有效的解决方案。但是,如果一个人正在努力编写简单的代码并且没有需要如此复杂的性能要求,那么是否有其他更简单的方法可以改进该算法而无需大量额外的代码?

for (int i=0; i < jList1.getModel().getSize(); i++) {
    String str = ((String)jList1.getModel().getElementAt(i)).toLowerCase();
    if (str.startsWith(m_key)) {
        jList1.setSelectedIndex(i); 
        jList1.ensureIndexIsVisible(i); 
        break;
    }
}

【问题讨论】:

  • 您是否测量过它会导致性能问题? JList 通常只包含几个元素(否则它们将无法使用),并且计算机每秒执行数十亿条指令。 GUI 大部分时间都在等待用户事件。不要过早优化。此代码简单、易于维护,并且可能不会造成任何损害。
  • JB Nizet:您对过早优化的担忧正是我不想费心实现和测试整个数据结构来优化它的原因!但是,如果在保持代码简单和可维护的同时可以进行其他更改,我完全支持更好的代码以及考虑平衡效率和简单性的练习
  • 请问这个有什么用?因为如果您创建某种自动完成算法,您将使用 B-tree 字典获得一些出色的性能。但它对图形表示没有用处,而且比这复杂得多。顺便说一句,如果您的列表已排序,您可以轻松优化您的代码。
  • 最可维护的代码是您不必维护的代码 :-) 或者换句话说:不要担心核心 Swing 细节,直到它们咬你。它的工程师可能已经权衡了典型用例的选项。因此,如果他们决定留下一个简单的顺序算法,可以假设它在第一次近似中已经足够好,直到你遇到一个特殊的用例

标签: java performance swing jlist comparator


【解决方案1】:

确保不要在每次迭代时浏览所有列表。 您可以在列表中进行 (n!) 次迭代,其中 (n) 就是您所需要的。

如果列表可以排序,使用部分比较可以快速得出正确答案。但是,如果您必须创建自己的搜索功能,可能会很麻烦。

【讨论】:

    【解决方案2】:

    我不同意此处发布的所有答案(并由 JB Nizet 稍微加密)。 JList 的一个可能替代方案是JTable with one Column(有或没有TableHeader)。 JTable 很好地实现了Sorting and Filtering

    【讨论】:

    • 不错的选择!什么是加密
    【解决方案3】:

    可能最快的优化(对于编码时间,而不是运行时间)是对列表进行排序,然后进行二分搜索。您有一次性的搜索前期成本(如果大量使用,它将被摊销),然后您将从 O(n) 变为 O(log(n))。根据我的经验,二分搜索相对简单,并且使用您已有的相同数据结构。

    当然,排序的 n-tree 结构在算法上会更快,但需要新的数据结构和更多的编码/测试时间。决定你想把时间花在哪里。

    【讨论】:

    • +1 直截了当。这是应该被接受的答案,因为其他都是对垃圾的小改进。
    【解决方案4】:

    为了快速改变,考虑

    String str = ((String)jList1.getModel().getElementAt(i));
    str.substring(1, m_key.length()).equalsIgnoreCase(m_key);
    

    除此之外,您自己的startsWithIgnoreCase 实现应该是快速且易于编写的。

    编辑:这似乎是将列表滚动到与用户输入匹配的元素。您绝对应该考虑更复杂的数据结构。这个做了很多,网上说不定能找到一些高效的算法。

    【讨论】:

    • 你跳过第一个字符的目的是什么?
    猜你喜欢
    • 2014-03-22
    • 2012-05-18
    • 2011-02-26
    • 2019-12-20
    • 2019-02-27
    • 2012-08-12
    • 1970-01-01
    • 2012-08-01
    • 2011-10-21
    相关资源
    最近更新 更多