2012-01-18 9 views
3

JListでプレフィックス検索を行うためのJavaコードがいくつか出てきました。しかし、それを見ると、キーイングごとにリストをリニアに検索し、タイトなループ内でスローケース変換を実行すると、アルゴリズムの難しさは非常に非効率的です。JList検索の効率

非常に大量のデータでは、カスタム実装の3値検索ツリーがはるかに効率的なソリューションになると思います。しかし、単純なコードを求めていて、そのような複雑さを必要とする性能要件がない場合、このアルゴリズムはかなりの量の追加コードを必要とせずに改善することができるより単純な方法がありますか?クイックチェンジのために

for (int i=0; i < jList1.getModel().getSize(); i++) { 
    String str = ((String)jList1.getModel().getElementAt(i)).toLowerCase(); 
    if (str.startsWith(m_key)) { 
     jList1.setSelectedIndex(i); 
     jList1.ensureIndexIsVisible(i); 
     break; 
    } 
} 
+3

パフォーマンスの問題が発生したと測定しましたか? JListsには通常、ほんのわずかの要素しか含まれていません(それ以外の場合は使用できません)。また、コンピュータは毎秒数十億命令を実行します。 GUIは、ユーザイベントを待つのにほとんどの時間を費やします。途中で最適化しないでください。このコードはシンプルで簡単に保守可能で、恐らく害はありません。 –

+0

JB Nizet:時期尚早の最適化について懸念しているのは、まさにデータ構造全体を実装してテストしても、それを最適化するのは苦労したくないからです。しかし、コードをシンプルで保守しやすい状態に保ったまま他の変更を加えることができれば、私はより良いコードと、効率と単純さのバランスについて考えてみようとしています。 –

+0

これをどのように使用するか質問できますか?何らかの自動補完アルゴリズムを作成すると、Bツリーの辞書を使っていくつかの素晴らしいパフォーマンスが得られるからです。しかし、それはグラフィカルな表現には役に立たず、それよりはるかに複雑です。ちなみに、あなたのリストがソートされていれば、コードをeaslyに最適化することができます。 – AxFab

答えて

2

String str = ((String)jList1.getModel().getElementAt(i)); 
str.substring(1, m_key.length()).equalsIgnoreCase(m_key); 

迅速かつ書きやすいれるべきであることを超えて一歩、startsWithIgnoreCaseの独自の実装のためを考えてみましょう。

EDIT:ユーザーの入力と一致する要素にリストをスクロールしているようです。より洗練されたデータ構造を考慮する必要があります。これは多く行われています。ネット上で効率的なアルゴリズムを見つけることができるかもしれません。

+0

最初の文字をスキップするのはどのような目的ですか? – AxFab

+0

それはタイプミスです.... –

2

おそらく最も速い最適化(実行時間ではなく、実行時間ではない)は、リストをソートしてバイナリ検索を行うことでしょう。あなたは検索のための1回限りの前払い費用があります(これは多く使われると償却されます)。その後、O(n)からO(log(n))に行きます。私の経験では、バイナリ検索は比較的単純で、既に持っているものと同じデータ構造を使用します。

もちろん、ソートされたn-tree構造はアルゴリズム的には高速ですが、新しいデータ構造とコーディング/テストに時間がかかります。あなたの時間をどこで過ごすか決めてください。

+0

+1は、ストレートフォワードアプローチです。これは、他のものが迷惑メールのマイナーな改善であるため、受け入れるべき答えです。 – chubbsondubs

2

私はここに投稿されているすべての回答に同意しません(JB Nizetによって少し暗号化されています)。 JListの可能な代替はJTable with one ColumnTableHeaderの有無にかかわらず)です。 JTableSorting and Filteringの優れた実装を持っています。

+0

いいです! _ancrypted_とは何ですか? – trashgod

0

各繰り返しですべてのリストを参照しないように注意してください。 リスト内で(n!)回繰り返すことができます。ここで(n)は必要なすべてです。

リストを並べ替えることができる場合は、部分的な比較を使用して、正しい回答にすばやく到達します。しかし、独自の検索機能を作成する必要がある場合、それは面倒かもしれません。

関連する問題