2017-03-20 9 views
0

正規表現を使用してセット内の文字列を検索する方法はありますか?例えば
私は.. AABなど、

をハッシュセットにAAA * Bを検索したい、と結果AAAABを期待してそのようなこと何が存在しない場合は、何があなたがハッシュセットの代わりに使用することをお勧め?

SQLのようにデータを検索する方法と同様の質問ですか?ハッシュセットの正規表現検索

+0

私の知るところでは、javaのリストにはinbuiltのような演算子はありません。あなたが行うことができる最も近いことは、あなたの構造体を(あなたの場合には)反復し、各オブジェクトに対して 'matches'メソッドを使うことです。見てくださいhttp://stackoverflow.com/questions/898405/how-to-implement-a-sql-like-like-operator-in-java –

+0

以下のリンクは役に立つかもしれません。それはあなたが持っていると同じソリューションのように見えます。重複している可能性があります。 [http://stackoverflow.com/questions/39674216/how-to-use-regular-expression-while-searching-in-hashset](http://stackoverflow.com/questions/39674216/how-to-use-検索中の正規表現中のハッシュセット) – Arindam

答えて

2

HashSetは、あなたをどこにでも逃すことはありません。これは非常に効率的な正確なルックアップのために設計されていますが、範囲や近接性の概念を持たないため、ファジールックアップにはまったく役に立たないです。

このような検索をサポートする標準的なデータ構造はありません。 NavigableSetインターフェイス(TreeSetは標準実装)を使用して、この機能の一部を自分で実装できます。

しかし、理想的には、標準のJavaデータ構造ではないRadix treeのようなものを使用する必要があります。

もちろん、あなたはHashSetを使って無理矢理実装することができます。すべてのエントリを繰り返し、あなたのパターンに対してそれぞれをチェックします。しかし、あなたの演奏はO(1)の代わりにO(n)なので、HashSet(重複を除いて)を使う利点はなく、ArrayListを使うこともできます。あなたはしかし、箱から出して...あなたがフィルターにストリームと正規表現を組み合わせることができないことを確認するために

0

は、たとえば、あなたが設定したF文字列を持っていて、/必要なものだけをしたい想像しています数字ではありません:

Set<String> languages = new HashSet<>(Arrays.asList("0", "java", "c++", "1234", "1999")); 
Set<String> resultFilteredLanguages = languages.stream().filter(line -> !line.matches("\\d+")).collect(Collectors.toSet()); 
resultFilteredLanguages.forEach(System.out::println);