2016-05-01 28 views
2

ある文字列が別の文字列に特定の長さのchar-sequenceを含んでいるかどうかをチェックしたいとします。2つの文字列の要素を比較するJava

String user1_hobbies = "friends, cinema/outside" 
String user2_hobbies = "outside, going out with friends" 
boolean check; 

if (user1_hobbies.contains(user2_hobbies)){ 
check = true; 
} else 
{check = false 
} 

ofc文字列全体に文字列全体が含まれている必要があるため、この試行は機能しません。私はちょうど両方の文字列の一部が一致するかどうかをチェックしたい。この場合、 "friends"または "outside"がマッチしているため一致する。あなたは、スプリット機能を配列に文字列を変換してから、次のように確認することができます

+1

最初の文から「単語」のみを抽出し、それぞれの単語についてstring2にその単語が含まれていることを確認してください。 – TheLostMind

+1

正しい抽象化を使用していません。コンマ区切りのStringではなく、のSetを使用します。 –

+0

重複を単語に限定していないので、より良いアルゴリズムについては、[最も長い共通部分文字列の問題](https://en.wikipedia.org/wiki/Longest_common_substring_problem)を参照する必要があります。例: ''私たちは最高の友達だった '' vs ''私たちは最悪の友達だった ''、重複は ''友人のこと ''となります。 – Andreas

答えて

3

、あなたは2つの文のための単語の2セットを作成して、交差点かどうかを確認することができ二組の間で非空であって:

Set<String> set1 = new HashSet<String>(Arrays.asList(user1_hobbies.split(" "))); 
Set<String> set2 = new HashSet<String>(Arrays.asList(user2_hobbies.split(" "))); 
set1.retainAll(set2); 

if (set1.size() > 0) { 
    System.out.println("There was a match."); 
} 
else { 
    System.out.println("There were no matches."); 
} 

あなたが最初のようにカンマやスラッシュなど、あなたが持つかもしれない余分な句読点を削除したい場合があります。あなたの実際の問題に加えてさらに多くの作業が必要になることがあります。

+0

''、 ''ではなく、 '' ''に分割したいと考えています。 – dimo414

+0

Thxたくさん:)私の基本的な問題は解決されました – Knuspakeks

+0

これは質問の非常にリベラルな解釈です。 「マウスは小さな動物です」は共通の単語「a」を見つけますが、「1つの文字列には別の文字列に特定の長さの文字列が含まれています」*は、必ずしも単語全体に限定されるものではない共通部分シーケンスの最小長さを望んでおり、 '' ouse''は[長い共通文字シーケンス](https://en.wikipedia.org/wiki/Longest_common_substring_problem)です。 – Andreas

-1

...これは役立つ

String[] array_user1_hobbies = user1_hobbies.split(" "); 
String[] array_user2_hobbies = user2_hobbies.split(" "); 
ArrayList<String> a1 = new ArrayList<String>(Arrays.asList(array_user1_hobbies)); 
ArrayList<String> a2 = new ArrayList<String>(Arrays.asList(array_user2_hobbies)); 
boolean matches = (a1.retainAll(a2).size()==0)?false:true; 

希望

私は文字列の2セットとして個々のユーザーの趣味を保存することをお勧めします
+0

OPの文字列には使えますか? – TheLostMind

+1

配列と配列を混合しています - 配列には 'retainAll()'メソッドがありません。 – dimo414

+0

thnx dimo414が私の間違いであり、私の答えが変わったのです –

1

。交差点が空でない場合は、交差点(つまり、一般的な趣味、set1.retainAll(set2))を簡単に見つけることができます。

ここでは、前のポストからの例:@JBNizetから先端に続き パブリッククラスTest {

public static void main(String... args){ 

    Set<String> set1 = new HashSet<String>(Arrays.asList("hobby1", "hobby2", "hobby3")); 
    Set<String> set2 = new HashSet<String>(Arrays.asList("hobby4", "hobby1", "hobby5", "hobby6")); 
    Set<String> intersection = new HashSet<String>(set1); 
    intersection = intersection.retainAll(set2); 

    System.out.println(intersection); 
} 
+0

ここで 'List'を使うとメリットはありません。 'Set'はより速く交差を計算することができます。あなたの 'intersection()'はO(n^2)です。 – dimo414

+0

ありがとうございます。今はセットで実装されています。 –

関連する問題