可能であれば、これらの方法をそれぞれテストして、状況に応じて最速の方法を確認してください。おそらくさまざまな要因に依存するため、特定のユースケースでどれが最適かを実際に予測することはできません.
オプション 0 (接頭辞がほとんどない場合に使用)
最も簡単なオプション: 接頭辞をリンクされたリストに保存し、 を使用してそれぞれをチェックしinput.startsWith(prefix)
ます。つまらない。
オプション 1 (数字以外のプレフィックスがある場合に使用)
を最小k
プレフィックス長とします。キーが各プレフィックスの最初の数字であり、アイテムが各プレフィックスの残りを含むリンクされたリストHashMap
であるa を使用します。k
たとえば、接頭辞abcd
、abce
、およびがあるとしxyz
ます。次に、以下を保存します。
"abc"
--> ("d","e")
、("d","e")
要素を含むリンクされたリストであり"d"
、"e"
"xyz"
--> ("")
(""
空の文字列はどこにありますか)。
この mapprefixes
を呼び出し、次のコードを使用してプレフィックスが正しいかどうかを判断します。
public boolean correctPrefix(String input){
LinkedList check = prefix.get(input.substring(0,k))
if (check != null){
for (String n : check){
if (input.substring(k).startsWith(check)) return true;
}
return false;
}
あなたの目的に十分な速さであるかどうかはわかりませんが、それらが何であるかを正確に教えてくれませんでした。それでも、 Java でより高速なものは知りません。
オプション 2 (すべてのプレフィックスが数値の場合、または SE7 を使用している場合はこれを使用します)
switch
ステートメントを使用します。むしろ、可能なプレフィックス長ごとに 1 つずつ、複数の switch ステートメントを使用します。たとえば、接頭辞1901
、1902
、およびがあるとし20050
ます。
public boolean correctPrefix(String input){
int pVal;
pVal = Integer.parseInt(input.substring(0,4));
switch (pval){
case 1901: return true;
case 1902: return true;
}
pVal = Integer.parseInt(input.substring(0,5));
switch (pval){
case 20050: return true;
}
return false;
}
これはより多くのコードになりますが、同じ長さのプレフィックスが十分にあると仮定すると、はるかに高速になると思います。switch
ステートメントに可能なケースがあまりない場合、実際には真のswitch
ステートメントとしてではなく、一連のif/else
ブロックとしてコンパイルされるため、かなり遅くなることに注意してください。ただし、これをいじって、何が得られるかを確認する必要があります。case [wrongprefix]: return false;
信じられないかもしれませんが、実際に物事をスピードアップできるので、いくつかの偽のステートメントを入れる価値があるかもしれません。
実際、SE7 の時点で、switch ステートメントは文字列で使用できます。これがどれほど効率的かはわかりませんが、オプションです。
または、SE7 より前のものを使用している場合は、試してみることができます....
オプション 3 (ごまかす方法)
実際には基数を に渡すことができparseInt
ます。つまり、プレフィックスに文字が含まれていても大文字と小文字が区別されない場合は、 を使用Integer.parseInt(input.substring(0,4),36)
して有効な整数値を取得し、それを で使用できますswitch
。