私は、ワイルドカード文字(?
で表される)を含む8文字の文字列のリストを持っています。ワイルドカード文字もあります。前記文字列は4つのアルファベット文字(A〜Z)と4つの数字(0〜9)で構成されている。私はA?CD12?4
は、入力として、比較は、すべての比較でtrueに解決する必要があります与える場合Javaの両側にあるワイルドカード文字との双方向文字列一致
ABCD1234
A??D123?
A???????
?BC1234?
:それは簡単に理解できるようにするため、ここでは文字列のセットの例です。
現在の実装では、文字列をキーとして使用し、同じ文字列を正規表現としてマッピングされたオブジェクトとして解析して、Hashmapを使用しています。例えばA?CD12?4
についてA([A-Z]|\\?)CD12([0-9]|\\?)4
となり、その後、互換性のある文字列のセットを取得するには、次のコードを使用して:
Map<String, String> map = new HashMap<String, String>();
map.put("A???????", "A([A-Z]|\\?)([A-Z]|\\?)([A-Z]|\\?)([0-9]|\\?)([0-9]|\\?)([0-9]|\\?)([0-9]|\\?)");
map.put("ABCD1234", "ABCD1234");
map.put("A??D123?", "A([A-Z]|\\?)([A-Z]|\\?)D123([0-9]|\\?)");
map.put("?BCD123?", "([A-Z]|\\?)BC123([0-9]|\\?)");
String str = "A?CD12?4";
String strReg = "A([A-Z]|\\?)CD12([0-9]|\\?)4";
Set<Object> set = map.keySet()
.stream()
.filter(s -> str.matches(map.get(s)) || s.matches(strReg))
.collect(Collectors.toSet());
しかし、これはまだインスタンスの入力ワイルドカード疑問符str
ではなく、マップの文字列上を(逃しました入力A?CD1234
は、?BCD1234
の場合は真となりません。逆の場合も同様です。
私は、これは文字列を反復処理によって修正するのは簡単だろう知っていますが、そう、私の解決策はを超える文字列と比較するための入力を必要とし、私の周り30 /秒のレートで入力を読みますパフォーマンスが重要です。
この処理はスレッド内で行われ、外部のやり取りによって入力がチェックする文字列のリストが変更されます(追加または削除のみ)。
ない答えが、あなたのコードのパフォーマンスを改善したい場合は、パターンのに正規表現をコンパイルし、文字列ではなく、マップでそれらを保存する必要があります。ここではパラレル・ストリームを使用して高速化ソリューションです一致するようにフィルタを調整します。 – haggisandchips
実行中に文字列のリストが変更される可能性があります。この制約を元の質問に追加します。 – fcm
もしそれが**変化することができれば**私のポイントはまだ立つ。同じ正規表現が2回以上マッチしている場合、それはそれに値する単純な最適化です。 – haggisandchips