我正在尝试实现我自己的 JTable RowFilter,因为我使用的是 Java 1.4(此版本中似乎不存在 RowFilter)。然而,我仍然相信我正在使用的算法可以被更快的算法取代。我已经在包含 30.000 条记录和 8 列的虚拟表上尝试了我的算法,并且我在不到一秒的时间内得到了结果。但有时,在输入搜索条件(基本上是带有 DocumentListener 的 JTextField)时会出现一点延迟。这是我正在使用的算法:
public void searchList()
{
for(int i=0;i<list.size();i++)
{
Employee e=(Employee)list.get(i);
Pattern pattern=Pattern.compile(search.getText(),Pattern.CASE_INSENSITIVE);
Matcher matcher=pattern.matcher(e.getFname());
if(matcher.find())
{
result.add(e);
continue;
}
matcher=pattern.matcher(e.getLname());
if(matcher.find())
{
result.add(e);
continue;
}
matcher=pattern.matcher(e.getHeight());
if(matcher.find())
{
result.add(e);
continue;
}
matcher=pattern.matcher(e.getOccupation());
if(matcher.find())
{
result.add(e);
continue;
}
matcher=pattern.matcher(e.getSize());
if(matcher.find())
{
result.add(e);
continue;
}
matcher=pattern.matcher(e.getSkills());
if(matcher.find())
{
result.add(e);
continue;
}
matcher=pattern.matcher(e.getSsn());
if(matcher.find())
{
result.add(e);
continue;
}
matcher=pattern.matcher(e.getStrength());
if(matcher.find())
{
result.add(e);
}
}
model.fireTableDataChanged();
table.updateUI();
}
}
我用来将数据绑定(bind)到 TableModel 的主要数据结构是一个 ArrayList,它保存名为“Employee”的类的对象。另一个名为 result 的 ArrayList 包含与搜索条件匹配的所有“Employee”对象。请记住,过滤发生在所有 8 列上。我认为我所做的唯一优化是在第一列匹配上添加“Employee”对象,而不必遍历其余列。
关于此事有什么建议吗?非常感谢您的帮助=)
最佳答案
由于您似乎在所有字段中搜索完全相同的值,因此我只需将它们连接起来并进行一次匹配即可。
此外,我认为没有任何充分的理由说明为什么您要在每次迭代中编译该模式。
关于java - JTable 中更快的搜索算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5814309/