2014-12-27 2 views
0
String one = "This is a test"; 
String two = "This is a simple test"; 

Я хочу, чтобы проверить, если two содержит все символы, которые находятся в one, и игнорировать тот факт, что имеют дополнительные символы.Проверьте, если строка имеет все символы другой строки

+0

Почему downvotes? Если вы знаете ответ, можете ли вы рассказать нам или ссылку на него? –

+0

Вы можете попробовать разбивать обе строки с использованием пробелов и искать элементы массива. – gab06

+2

Когда вы говорите «содержит все символы», вы имеете в виду: 1) символы в строке1 содержатся в строке2 в той же последовательности, что и дополнительные символы. 2) каждый символ в строке 1 также присутствует в строке2 независимо от количества вхождений или 3) каждый символ в строке 1 содержится как минимум столько раз в строке 2? – Svea

ответ

8

Самая быстрая вещь, вероятно, будет нарушать их до HashSet с, а затем применить containsAll

public static Set<Character> stringToCharacterSet(String s) { 
    Set<Character> set = new HashSet<>(); 
    for (char c : s.toCharArray()) { 
     set.add(c); 
    } 
    return set; 
} 

public static boolean containsAllChars 
    (String container, String containee) { 
    return stringToCharacterSet(container).containsAll 
       (stringToCharacterSet(containee)); 
} 

public static void main(String[] args) { 
    String one = "This is a test"; 
    String two = "This is a simple test"; 
    System.out.println (containsAllChars(one, two)); 
} 
+0

Отсутствие точки с запятой. – gab06

+1

@ gab06 благодарит за заметку! Исправлена. – Mureinik

+0

Это не сработает, если мы проверим строки «ABCD» и «ACC». Он вернет «true», поскольку C будет сравниваться один раз. – korujzade

1

Используя простой цикл по набору символов в первой строке:

String s1 = "This is a test"; 
String s2 = "This is a simple test"; 
Set<Character> chars = new HashSet<Character>(); 
for(int i = 0; i < s1.length(); i++) { 
    chars.add(s1.charAt(i)); 
} 


for (Iterator<Character> iterator = chars.iterator(); iterator.hasNext();) { 
    Character character = iterator.next(); 
    if(!s2.contains(character.toString())) { 
     // break and mark as not contained 
     break; 
    } 
} 

Если слова предназначены для проверки, то вы можете разделить строку вокруг пробелов на список слов:

String[] words1 = s1.split("\\s"); 
String[] words2 = s2.split("\\s"); 

List<String> wordList1 = Arrays.asList(words1); 
List<String> wordList2 = Arrays.asList(words2); 
System.out.println(wordList2.containsAll(wordList1)); 
1
static boolean stringContains(String longer, String shorter) { 
    int i = 0; 
    for (char c : shorter.toCharArray()) { 
     i = longer.indexOf(c, i) + 1; 
     if (i <= 0) { return false; } 
    } 
    return true; 
} 
+1

Он работает, но он медленный из-за сложности O (n * m). –

0

Попробуйте это. Я знаю, что это долго, но это работает

public static void main(String[] args) 
{ 
    String String1,String2; 
    int i, j, count1, count2; 
    count1 = 0; 
    count2 = 0; 
    String1 = "This is a test"; 
    String2 = "This is a simple test"; 
    char[] list1 = new char[String2.length()]; 
    char[] list2 = new char[String2.length()]; 
    char[] list3 = new char[String2.length()]; 
    for (i = 0; i <= String1.length() - 1; i++) 
    { 
     list1[i] = String1.charAt(i); 
     for (j = 0; j <= String2.length() - 1; j++) 
     { 
      list2[j] = String2.charAt(j); 
      if (list1[i] == list2[j]) 
      { 
       i++; 
       count1++; 
      } 
     } 
    } 
    for (i = 0; i <= String1.length() - 1; i++) 
    { 
     list1[i] = String1.charAt(i); 
     for (j = 0; j <= String1.length() - 1; j++) 
     { 
      list3[j] = String1.charAt(j); 
      if (list1[i] == list3[j]) 
      { 
       i++; 
       count2++; 
      } 
     } 
    } 

    if (count1 >= count2) 
     System.out.println(true); 
    else 
     System.out.println(false); 
} 
+1

Ну, у меня есть некоторые вопросы об этом: почему вы используете массивы, если вы просто сравниваете результаты 'String1.charAt (i)' и 'String2.charAt (j)'? Почему вы увеличиваете счетную переменную внешних контуров, если конкретный символ соответствует другому? И, наконец: какова цель второго цикла цикла, когда вы просто проверяете, что 'String1' содержит те же символы, что и' String1'? – Tom

+0

В первом цикле я сравниваю String1 со String2. Count1 - это номер одного и того же символа между строкой 1 и строкой 2. Я не был символом, если он используется раньше. Во втором цикле я сравнил String1 с самим собой, чтобы увидеть, сколько разных символов String1 имеет.Count2 - количество разных символов в String2 –

+0

Можете ли вы сделать мне одолжение? Измените 'String1' на' 'Это тест x" и посмотрите, работает ли ваш код. Проблема с вашим 'i ++' заключается в том, что она пропускает символы 'String1'. – Tom

-1
two.startsWith(one) 

Если вы не уверены в пусковое положение (выше предполагает 0), попробуйте использовать следующий API

startsWith(String, offset) 
+0

Это не то, что ОП что. 'one' не обязательно должна быть полной подстрокой' two', чтобы содержать одни и те же символы. Например, 'test; estt' потерпит неудачу с вашим методом. – Tom

+0

@ Тома, я вижу, теперь есть разговор под оригинальным вопросом. Однако, когда я ответил, такого разговора не было, и поэтому я так толковал его. – justanother

Смежные вопросы