Java JTable中的一种快速搜索算法
我正在尝试实现我自己的JTable RowFilter,因为我使用的是Java1.4(RowFilter在这个版本中似乎不存在)。然而,我仍然相信我正在使用的算法可以被一个更快的算法所取代。我在一个包含30000条记录和8列的虚拟表上尝试了我的算法,我在不到一秒钟的时间内得到了结果。但有时,在键入搜索条件(基本上是一个带有DocumentListener的JTextField)时会出现这种小延迟。以下是我使用的算法:Java JTable中的一种快速搜索算法,java,swing,jtable,rowfilter,Java,Swing,Jtable,Rowfilter,我正在尝试实现我自己的JTable RowFilter,因为我使用的是Java1.4(RowFilter在这个版本中似乎不存在)。然而,我仍然相信我正在使用的算法可以被一个更快的算法所取代。我在一个包含30000条记录和8列的虚拟表上尝试了我的算法,我在不到一秒钟的时间内得到了结果。但有时,在键入搜索条件(基本上是一个带有DocumentListener的JTextField)时会出现这种小延迟。以下是我使用的算法: public void searchList() {
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();
}
}
public void searchList()
{
对于(int i=0;i,因为您似乎在所有字段中搜索完全相同的值,所以我只需将它们串联起来并进行一次匹配
另外,我认为没有什么好的理由让您在每次迭代中编译模式。因为您似乎在所有字段中搜索完全相同的值,所以我只会将它们串联起来,并进行一次匹配
另外,我认为没有什么好的理由让你们在每次迭代中都编译模式。为了让你们了解我的问题,我最终做了以下工作:1-将所有字段连接在一起,并在它们之间加一个分隔符(“!”)2-从该链接下载了SearchString库johannburkard.de/software/stringsearch 3-将连接字符串和搜索条件模式转换为小写。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秒完成
第二次运行:
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秒完成
第二次运行:
1个字符长的模式:操作花费8.172秒完成
2个字符长的模式:操作花费8.312秒完成
3个字符长的模式:操作花费5.484秒完成
4个字符长的模式:操作花费3.922秒完成
5个字符长的模式:操作花费3.922秒完成
6个字符长的模式:操作花费4.047秒完成
请注意,模式过滤(第一种方法)在进行单个字符匹配时速度更快,但随着模式长度的增加,Boyer-Moore-Horta的效果会更好
我希望这会对某些人有所帮助。
干杯。为了向大家介绍我的问题,我终于做了以下工作:1-将所有字段连接在一起,并在它们之间加上分隔符(“!”)2-从该链接下载了SearchString库johannburkard.de/software/stringsearch 3-将连接字符串和搜索条件模式转换为小写。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秒完成
第二次运行:
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个字符长的图案: