JTable中更快的搜索算法

时间:2011-04-28 06:04:31

标签: java swing jtable rowfilter

我正在尝试实现自己的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”对象,而不必遍历其余列。

有关此事的任何建议?非常感谢帮助=)

2 个答案:

答案 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。

我希望这会以某种方式帮助某人。 干杯。