我正在尝试实现自己的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();
}
}
我用来将数据绑定到我的TableModel的主数据结构是一个ArrayList,它包含一个名为“Employee”的类的对象。另一个名为result的ArrayList包含与搜索条件匹配的所有“Employee”对象。请记住,过滤发生在所有8列上。我认为我做的唯一优化是在第一列匹配中添加“Employee”对象,而不必遍历其余列。
有关此事的任何建议?非常感谢帮助=)
答案 0 :(得分:4)
由于您似乎在所有字段中搜索完全相同的值,我只是将它们连接起来并进行一次匹配。
另外,我认为你没有任何理由在每次迭代中编译模式。
答案 1 :(得分:0)
就我的问题更新你们,我终于完成了以下工作:1-连接所有字段以及它们之间的分隔符(“!”)2-从此链接下载了SearchString库johannburkard.de/ software / stringsearch 3-将连接的字符串和搜索条件patten转换为lowerCase。 4-通过执行以下操作使用Boyer Moore,Raita算法: BoyerMooreHorspoolRaita searchAl=new BoyerMooreHorspoolRaita();
然后我执行了此操作:
int j=searchAl.searchString(match, search.getText()); if(j!=-1) result.add(e);
我尝试将我使用的第一种方法与包含100000条记录的表格进行比较,结果如下:
模式匹配: 第一次跑: 1字符长模式:操作需要3.328秒才能完成 2个字符长模式:操作需要14.14秒才能完成 3个字符长模式:操作需要11.328秒才能完成 4个字符长模式:操作需要8.437秒才能完成 5个字符长模式:操作需要8.344秒才能完成 6个字符长模式:操作需要8.078秒才能完成
SECOND RUN: 1字符长模式:操作需要3.281秒才能完成 2个字符长模式:操作需要14.14秒才能完成 3个字符长模式:操作需要11.344秒才能完成 4个字符长模式:操作需要8.375秒才能完成 5个字符长模式:操作需要8.469秒才能完成 6个字符长模式:操作需要8.266秒才能完成
Boyer Moore RAITA: 第一次运行: 1字符长模式:操作需要11.688秒才能完成 2个字符长模式:操作需要10.594秒才能完成 3个字符长模式:操作需要7.563秒才能完成 4个字符长模式:操作需要4.328秒才能完成 5个字符长图案:操作需要4.5秒才能完成 6个字符长模式:操作需要4.969秒才能完成
SECOND RUN: 1字符长模式:操作需要8.172秒才能完成 2个字符长模式:操作需要8.312秒才能完成 3个字符长模式:操作需要5.484秒才能完成 4个字符长模式:操作需要3.922秒才能完成 5个字符长模式:操作需要3.922秒才能完成 6个字符长模式:操作需要4.047秒才能完成
请注意,单个字符匹配时,模式过滤(第一种方法)更快。但随着模式的长度增加,Boyer Moore Horspool Raita只是SHINES。
我希望这会以某种方式帮助某人。 干杯。