2017-07-29 10 views
3

の任意の要素を部分的に一致した場合、私は私が探している何StringJavaのラムダ - リストの任意の文字列要素が別のリスト

A = {"apple", "mango", "pineapple", "banana", ... } 

B = {"app", "framework",...} 

の2つのリストをしました見つけることがこれです:Bのいずれかの要素がです少なくともAの任意の要素(例えば、B 'appの第1要素)と部分一致(substring/contains/startsWith)は、少なくとも1つの要素「apple」と部分的に一致する。

StackOverflowの他の類似したトピックには、2つのリストはありません。

Javaラムダを使用してソリューションを表現するうまい方法はありますか?

検索ドメインで一般的な問題だと感じています。だから、もしこのトピックに関する何か助けや興味深い読書があれば、私は指針を受け取ってうれしいです。

+0

最初のものは並列化です。リンゴのヒットはマンゴーのヒットには依存しません。それで何らかの暗記があります。リンゴのヒットはパイナップルにも良いです。この作品を私が答えとして投稿します。ラムダ/ストリームを使用する前に、通常のループが機能します。リストが10k +長であれば、ストリームとラムダについて考えてください – efekctive

+0

@efekctive:なぜですか?ストリームはパフォーマンスだけでなく、コードを理解しやすくすることもできます。 –

+0

最初に問題を解決した場合。私はたくさんの "ストリームは人生を楽にします、おっと、これは問題を解決しません。 – efekctive

答えて

5

あなたはエレガントで何を意味するかに依存しますが、この試してみてください。

List<String> r = list1 
    .parallelStream() 
    .filter(w1->{ 
     return list2 
     .parallelStream() 
     .anyMatch(w2->w1.contains(w2)); 
     } 
    ) 
    .collect(Collectors.toList()); 

anyMatch(およびfilter)を短絡することができ、w1.contains(w2)の最初の一致を検出した後に第二のリストの流れを中止します見つかった場合は真を返し、効率を与えます。これを使用して、最初のストリームをフィルタリングします。パラレルストリームで行います。

+1

コメントごとに編集されました。 –

+1

コードが正しいリストを生成します。条件が満たされた場合、ブール値を探していました。 ソリューションから、簡単な微調整は動作します: 'ブールanyMatch = listOne.parallelStream() .anyMatch(W1-> listTwo.parallelStream() .anyMatch(W2-> w1.contains(W2))); System.out.println(anyMatch); ' – RRM

2

は、次の2つList<String>の連鎖の流れとはString.contains()でフィルタリングしたりでき、使用したい他の条件(substring()startsWith())。

次にあなたがString配列に有効な条件という文字列のカップルをマッピングすることができます:

List<String> listOne = Arrays.asList("apple", "mango", "pineapple", "framework"); 
List<String> listTwo = Arrays.asList("app", "frame"); 

List<String[]> values = listOne.stream() 
    .flatMap(x -> listTwo.stream() 
     .filter(y -> x.contains(y)) 
     .map(y -> { 
      return new String[] { x, y }; 
     })) 
    .collect(Collectors.toList()); 

for (String[] array : values) { 
    System.out.println(Arrays.toString(array)); 
} 

出力:

[アップル、アプリ]

[パイナップル、アプリ]

[フレームワーク、フレーム]

+0

私は実際に部分的な文字列の一致に対してブール結果を探していました。あなたが書いた2番目のサンプルコードには 'String.contains'ではなく' List.contains'が含まれています。チェックしたところで出力はfalseです。 – RRM

+0

右。私は2番目の文字列を比較しません。申し訳ありませんが、私はこれを試していませんでした。私はそれを削除するように更新しました。とにかく、フィードバックに感謝します。 – davidxxx

関連する問題