2011-04-28 18 views
0

Java 1.4(RowFilterはこのバージョンには存在しないようです)を使用しているため、私自身のJTable RowFilterを実装しようとしています。私はまだ私が使用しているアルゴリズムは、はるかに高速なものに置き換えることができると信じています。 30.000レコードと8列のダミーテーブルでアルゴリズムを試してみましたが、1秒未満で結果を得ています。しかし、検索基準(これは基本的にDocumentListenerを持つJTextField)を入力する際に​​発生するこの遅れがあります。JTableの高速検索アルゴリズム

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のである:ここでは私が使用しているアルゴリズムです。 resultという別のArrayListには、検索条件に一致するすべての "Employee"オブジェクトが含まれています。フィルタリングは8列すべてで行われていることに注意してください。私がやったと思う唯一の最適化は、最初の列のマッチに "Employee"オブジェクトを追加し、残りの列を通過する必要はありません。

この問題に関するご意見はありますか?助けをありがとう=)

+0

あなたの問題とは無関係ですが、それでも重要なことは決してアプリケーションコード内でupdateUIを呼び出すことは決してありません!それは、プラグイン可能なLAFメカニズムの(近くに)排他的な使用のためにあります。一見すると分かりにくいアップデートの問題を解決するために強制されていると感じたら、コードに何か間違いがあり、すぐに注意が必要です – kleopatra

答えて

4

すべてのフィールドで正確に同じ値を検索しているように見えるので、私はそれらを連結して一度マッチングします。

また、すべての反復でパターンをコンパイルする理由がないと思います。

+3

連結は注意して処理する必要があります。私たちは列の値 "abc"と "def"を持っていて、 "cde"を探します。連結すると偽陽性になります。 - >したがって、コンカルトに行く場合は区切り文字を挿入することを忘れないでください( "abc" + "def"の代わりに "abc" + "@@" + "def") –

+0

助けてくれてありがとう。そしてFredrik、私はちょうど私が誤って私のFORループの中にPatter.compileを入れたことに気付いた。しかし、警報をありがとう;) –

+0

@Andreas_D良い点 – Fredrik

0

私の質問であなた方を更新するには、つぎのようにしました:1すべてのフィールドを区切り記号(「!」)で連結します。2-このリンクjohannburkard.deからSearchStringライブラリをダウンロードしました。/software/stringsearch 3連結された文字列と検索条件pattenをlowerCaseに変換しました。 4-次に、私はこれをしました: int j=searchAl.searchString(match, search.getText()); if(j!=-1) result.add(e);

100000レコードを含むテーブルの中で私が使った最初の方法と比較しようとしましたが、その結果は次のようになりました。次のように:

パターンマッチング: FIRST RUN: 1文字長いパターンを:操作は 2文字に長いパターンを完成するために3.328秒を要します。操作は 3文字を完了するために、14.14秒かかった長いパターン:操作は11.328秒かかりました完了するまで 4文字の長いパターン:Ope配給は 5文字に長いパターンを完成するために8.437秒を要します。操作は 6文字に長いパターンを完成するために8.344秒かかりました: 1文字長いパターン:操作が

SECOND RUNを完了するために、8.078秒かかった操作に3.281秒かかりました 2文字に長いパターンを完了してください。操作は長いパターン 3文字を完了するために、14.14秒を要します。操作は 4文字を完了するのに長いパターンを11.344秒を要した:操作が 5文字を完了するのに長いパターンを8.375秒を要した:操作は を完了するために、8.469秒かかりました6文字の長いパターン:操作操作は長いパターン 2文字を完了するために、11.688秒を要した:操作は 3文字を完了するのに長いパターンを10.594秒を要した: FIRST RUN: 1つの文字長いパターン

ボイヤームーア雷太を完了するために、8.266秒かかった操作7を取った。563秒は 4文字に長いパターンを完成させます。操作は長いパターン 5文字を完了するために、4.328秒を要します。操作は 6文字を完了するのに長いパターンを4.5秒を要した:操作は

SECOND RUNを完了するために4.969秒かかりました: 1文字長パターン:完了までに8.172秒がかかりました 2文字長いパターン:完了に8.312秒かかりました 3文字長いパターン:完了までに5.484秒かかりました 4文字長いパターン:完了までに3.922秒かかりました 5文字長いパターン:操作は3.922秒を要した完了するためにdsを入力してください 6文字長いパターン:完了までに4.047秒かかりました

1文字一致の場合、パターンフィルタリング(最初の方法)は高速です。しかし、Boyer Moore Horspool Raitaは、パターンの長さが増すにつれて、ただSHINESになります。

私はこれが何とか誰かを助けてくれることを願っています。 乾杯。