2016-05-01 6 views
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 
} 

Эта попытка не работает, потому что вся строка должна содержать всю последовательность символов. Я просто хочу проверить, будут ли совпадать только части обеих строк ... в этом случае они должны совпадать, потому что «друзья» или «внешние» соответствуют.

+1

Вы можете извлечь только «слова» из вашего первого предложения и для каждого из них, проверьте, содержит ли строка2 это слово – TheLostMind

+1

. Вы не используете правильную абстракцию. Используйте набор вместо строки с разделителями-запятыми. –

+0

Поскольку вы не ограничивали перекрытие только словами, вы должны посмотреть на [Самая длинная общая проблема подстроки] (https://en.wikipedia.org/wiki/Longest_common_substring_problem) для лучшего алгоритма. Пример: «Мы были лучшими друзьями», «против», «мы были худшими друзьями», совпадением было бы «« друзей ». – Andreas

ответ

3

После верхушки от @JBNizet, вы можете создать два набора слов для двух предложений, а затем проверить, если пересечение между двумя наборами непустым:

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

Это очень либеральная интерпретация вопроса. «Это был дом», «Мышь - маленькое животное», «найдет общее слово», а «', но * »одна строка содержит определенную длину символьной последовательности в другой строке» * будет означать, что мы требуется минимальная длина общей подпоследовательности, не обязательно ограничиваемая целыми словами, а '" 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; 

надеюсь, что это поможет

+0

Будет ли это работать для строк OP? – TheLostMind

+1

Вы смешиваете массивы и наборы - массивы не имеют метода 'keepAll()'. – dimo414

+0

thnx dimo414 за предложение, которое было моей ошибкой, меняя мой ответ –

1

Я рекомендовал бы спасая хобби отдельных пользователей, так как два набора строк , Затем вы можете легко найти перекресток (т. Е. Общие увлечения, set1.retainAll (set2))

или в вашем случае установите check = true, если пересечение не пустое!

Вот пример из предыдущего поста: общественного класс 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

Здесь нет никакой пользы от использования «Список». «Набор» может вычислять пересечения намного быстрее. Ваш 'intersection()' равен O (n^2). – dimo414

+0

Спасибо. Теперь он реализован с наборами. –