【问题标题】:Swing autocomplete for large, expensive datasetsSwing 自动完成大型、昂贵的数据集
【发布时间】:2013-04-13 01:43:54
【问题描述】:

我正在尝试为 Swing JTextField 实现自动完成,其中可能的自动完成条目集可能很大(10-100K 项)并且检索起来很昂贵,但搜索条目集相当便宜。谁能指出一个好的解决方案,最好是图书馆的形式?我查看了SwingX autocomplete,但它不是为您没有索引访问的情况而设计的。


更新:由于显然不清楚,问题不在于搜索大量条目很昂贵(事实并非如此),而是获取完整的集合在这种特殊情况下,条目既昂贵又不切实际。

【问题讨论】:

  • 数组应该被排序,比较器引擎将在输入第三个字符后启动,然后匹配减少到最小
  • 这不是问题,问题是我无法直接访问数组。

标签: java swing autocomplete


【解决方案1】:

Glazed Lists 我很幸运。这是假设您可以将整个数据集加载到内存中并将其保存在那里。我已经完成了大约 20K 个项目。

【讨论】:

  • 正如我所说,我无法将整个数据集加载到内存中。如果可以,我会使用 SwingX。
  • 到 OP 使用 Embedded database +1 来回答对 2013 年编程不重要的任何问题
  • @mKorbel 数据在服务背后,当有一个完美匹配的 API 时,将其全部传输到客户端是非常过分的。我不是在要求一种有效的方式将数据存储在客户端上,所以请停止提供它们。
  • 如果数据在支持分页的服务后面使用,顺便说一句,如果没有重要细节,这个问题根本无法回答
【解决方案2】:

我最终在 this answer 中找到了 Samuel Sjöberg 的“Autocompletion in Swing”,并在此基础上实现了以下解决方案。

public class MyAutocompleteDocument extends DefaultStyledDocument {

  @Override
  public void insertString ( int offs, String str, AttributeSet a ) throws BadLocationException
  {
    if ( !StringUtils.isBlank( str ) )
    {
        String text = getText( 0, offs ); // Current text up to insert point
        String completion = complete( text + str ); // Full completed string

        if (!StringUtils.isBlank( completion )) { // not "" or null
            String textToInsert = completion.substring( offs );

            // Always overwrite on complete
            int oldLength = getLength();
            remove( offs, oldLength - offs );
            super.insertString( offs, textToInsert, a );

            // Select the auto-completed portion so it's easy to keep typing
            owner.select( offs + str.length(), getLength() );
        } else {
            super.insertString( offs, str, a );
        }
    }
  }

  private String complete(String startsWith) {
      // access service to search for completion
  }
}

不确定它是否适用于所有情况,但它似乎涵盖了我的情况。

【讨论】:

    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2020-04-14
    • 2011-12-06
    • 1970-01-01
    相关资源
    最近更新 更多