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"オブジェクトを追加し、残りの列を通過する必要はありません。
この問題に関するご意見はありますか?助けをありがとう=)
あなたの問題とは無関係ですが、それでも重要なことは決してアプリケーションコード内でupdateUIを呼び出すことは決してありません!それは、プラグイン可能なLAFメカニズムの(近くに)排他的な使用のためにあります。一見すると分かりにくいアップデートの問題を解決するために強制されていると感じたら、コードに何か間違いがあり、すぐに注意が必要です – kleopatra