2015-11-30 4 views
-2

В основном я пытаюсь создать алгоритм, который будет проверять, является ли данная строка строкой обложки для списка строк. Строка - это строка обложки, если она содержит символы для каждой строки в списке способом, который поддерживает порядок слева и справа от перечисленных строк. Например, для двух строк «cat» и «dog» «cadhpotg» будет строкой обложки, но «ctadhpog» не будет такой.Логический алгоритм, производящий истинный вывод, когда вывод должен быть ложным

Я создал алгоритм, однако он производит вывод true, когда вывод должен быть ложным, поскольку данная строка является обложкой String для строк List1 и list2, но не для list3.

Любая помощь в том, почему этот алгоритм производит неправильный вывод, будет высоко оценена.

public class StringProcessing2 { 

//ArrayList created and 3 fields added. 
public static ArrayList<String> stringList = new ArrayList<>(); 
public static String list1 = "phillip"; 
public static String list2 = "micky"; 
public static String list3 = "fad"; 

//Algorithm to check whether given String is a cover string. 
public static boolean isCover(String coverString){ 
    int matchedWords = 0; 
    stringList.add(list1); 
    stringList.add(list2); 
    stringList.add(list3); 

    //for-loops to iterate through each character of every word in stringList to test whether they appear in 
    //coverString in left to right order. 
    for(int i = 0; i < stringList.size(); i++){ 
    int countLetters = 1; 
     for(int n = 0; n < (stringList.get(i).length())-1; n++){ 
      if(coverString.indexOf(stringList.get(i).charAt(n)) <= (coverString.indexOf((stringList.get(i).charAt(n+1)), 
        coverString.indexOf((stringList.get(i).charAt(n)))))){ 
       countLetters++; 
       if(countLetters == stringList.get(i).length()){ 
       matchedWords++;      
       }         
      }    
     } 
    } 
if(matchedWords == stringList.size()){ 
    return true; 
} 
else 
    return false; 
} 

public static void main(String[] args) { 
System.out.println(isCover("phillmickyp")); 

} 


} 
+2

Вы должны отлаживайте его с помощью IDE. Это поможет вам учиться. Я бы также начал с более легкого примера, чтобы понять, что не так. – BobTheBuilder

+0

Возможно, это [test drive] (https://en.wikipedia.org/wiki/Test-driven_development). Здесь много возможностей для ошибок регрессии. – weston

+1

Подумайте о примере 'phillip'. Это содержит 'i' перед символами' l' ** и ** '' 'непосредственно перед' i'. Подумайте, почему это делает вещи более сложными. –

ответ

0

Возможно, самый простой способ решить эту проблему - разбить проблему на части. У каждой функции есть наименее возможная работа, хотя все еще делается что-то по отношению к общей цели.

Для этого я бы рекомендовал создать вспомогательный метод, который принимает две строки и возвращает логическое значение, проверяя, является ли одна String оболочкой другого.

boolean isCover(String s, String cover) 
{ 
    int i = 0; 
    for(char c : s.toCharArray()) 
    if((i = cover.indexOf(c, i)) == -1) 
     return false; 
    return true; 
} 

Затем, когда у вас есть что-то, что может правильно сказать вам, если это действительный подвеснные или нет, становится намного проще, чтобы проверить, если одна строка является допустимым прикрытием для нескольких строк

boolean isCover(List<String> strings, String cover) 
{ 
    for(String s : strings) 
    if(!isCover(s, cover)) 
     return false; 
    return true; 
} 
+0

Большое спасибо за ответ, я никогда раньше не видел метод создания продвинутого цикла или считал концепцию преобразования строки в массив символов, которые являются невероятно полезными советами. – Mickd94

+0

Я никогда раньше не видел продвинутого цикла, не могли бы вы объяснить мне логику первого булева и как он обеспечивает сохранение порядка слева от символов в обложке? Было бы очень полезно. – Mickd94

+0

@ Mickd94 [for-each loop] (https://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html) выполняет итерации по коллекциям, в данном случае массиву. Цикл for-each показывает каждое значение в массиве один за другим, начиная с 0, в этом случае каждый символ в String. Int - сохранить последнюю позицию найденной буквы, так как каждое новое письмо должно быть выше последнего, иначе строка обложки будет не в порядке. – phflack

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