我遇到了一些用于在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;
}
}
答案 0 :(得分:2)
要快速更改,请考虑
String str = ((String)jList1.getModel().getElementAt(i));
str.substring(1, m_key.length()).equalsIgnoreCase(m_key);
除了这一步之外,你自己的startsWithIgnoreCase
实现应该快速而且易于编写。
编辑:这似乎是将列表滚动到与用户输入匹配的元素。你绝对应该考虑更复杂的数据结构。这样做了很多,你可以在网上找到一些有效的算法。
答案 1 :(得分:2)
最快的优化(对于代码的时间,而不是运行时间)可能是对列表进行排序,然后进行二进制搜索。你有一次性的前期搜索费用(如果这个使用很多,将会摊销),然后你将从O(n)转到O(log(n))。根据我的经验,二进制搜索相对简单,并使用您已有的相同数据结构。
当然,排序的n树结构在算法上会更快,但需要新的数据结构和更多的编码/测试时间。决定你想花时间在哪里。
答案 2 :(得分:2)
我不同意这里发布的所有答案(并且由JB Nizet加密一点)。 JList
的可能替代方案是JTable with one Column(有或没有TableHeader
)。 JTable
可以很好地实现Sorting and Filtering。
答案 3 :(得分:0)
请务必在每次迭代时不浏览所有列表。 您可以在列表中进行(n!)迭代,其中(n)就是您所需要的。
如果列表可以排序,则使用部分比较来快速获得正确的答案。但是,如果你必须创建自己的搜索功能,它可能会很乱。