我在一个文件中有大约 2500 个短语。我希望能够在输入可能的子字符串时找到短语。我的应用程序有一个文本框和一个短语列表。文本框最初是空的,列表包含所有 2500 个短语,因为空字符串是所有短语的子字符串。当我在文本框中键入内容时,列表会更新,因此它始终只包含以文本框的值作为子字符串的短语。
目前我有一个 Google 的 Multimaps,具体来说:
LinkedHashMultimap<String, String>
将每个可能的子字符串映射到它可能的匹配项。这需要一段时间才能加载(大约一秒钟),我认为它一定会占用相当多的空间(这可能是 future 的一个问题。)不过查找速度非常快。
有没有一种方法可以使用其他一些数据结构或策略来执行此操作,这些数据结构或策略可以更快地加载并占用更少的空间(可能以牺牲查找速度为代价)?
最佳答案
如果您的列表只包含 2500 个元素,一个简单的循环并检查所有元素的 contains() 应该足够快。
如果它变大和/或太慢,您可以应用一些简单的优化:
- 不要在用户键入每个字符时立即进行搜索,而是引入一些延迟。因此,如果他非常快地键入“foobar”,您只搜索“foobar”,而不是先搜索“f”,然后搜索“fo”,然后搜索“foo”,...
- 重复使用之前的结果:如果用户首先键入“foo”然后将其扩展为“foobar”,则不要再次在整个原始列表中搜索,而是在结果中搜索“foo”(因为包含“foobar”必须包含“foo”)。
根据我的经验,这些基本的优化已经让你走得很远了。
现在,如果列表增长得如此之大以至于速度太慢,则需要按照此处其他答案中提出的一些“更智能”的优化(尝试、后缀树等)。
关于java - 是否有一些更好的方法可以在您使用相当小的数据集输入 Java 时实现查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2410320/