Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable中的一种快速搜索算法_Java_Swing_Jtable_Rowfilter - Fatal编程技术网

Java JTable中的一种快速搜索算法

Java JTable中的一种快速搜索算法,java,swing,jtable,rowfilter,Java,Swing,Jtable,Rowfilter,我正在尝试实现我自己的JTable RowFilter,因为我使用的是Java1.4(RowFilter在这个版本中似乎不存在)。然而,我仍然相信我正在使用的算法可以被一个更快的算法所取代。我在一个包含30000条记录和8列的虚拟表上尝试了我的算法,我在不到一秒钟的时间内得到了结果。但有时,在键入搜索条件(基本上是一个带有DocumentListener的JTextField)时会出现这种小延迟。以下是我使用的算法: public void searchList() {

我正在尝试实现我自己的JTable RowFilter,因为我使用的是Java1.4(RowFilter在这个版本中似乎不存在)。然而,我仍然相信我正在使用的算法可以被一个更快的算法所取代。我在一个包含30000条记录和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();
    }
    }
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个字符长的图案: