2015-11-08 4 views
0

Это скорее алгоритмический вопрос.Обнаружение шаблона в списке/массиве

У меня есть список Java (отсортированный) или массив, состоящий из символов (X и Y), и мне нужно определить определенный шаблон способа упорядочивания значений.

Размер списка фиксирован (например, 5). Образцы, которые я хотел бы обнаружить, следующие:

XYYYY 
XXYYY 
XXXYY 
XXXXY 
XXXXX 

Таким образом, X всегда следует только Y.

Простые String.equals или contains не работают, поскольку он не масштабируется и ограничен известным размером списка.

+0

Итак, что картина? По крайней мере один X, а остальная часть строки Y? –

+0

Да, хотя бы один X и все остальные Y, а до X может быть только X. – Michael

ответ

0

Вы можете использовать простое регулярное выражение для этого:

boolean matches = s.matches("^X+Y*$"); 

Это означает:

  • ^ соответствует началу строки
  • X+ означает один или более последовательных X s
  • Y* означает ноль или более последовательный Y s
  • $ конец строки

В качестве альтернативы, вы можете проверить строку символов мудрые:

int i = 0; 
while (i < s.length() && s.charAt(i) == 'X') { 
    ++i; 
} 
if (i < s.length()) { 
    if (s.charAt(i) != 'Y') { 
    return false; 
    } 
    while (i < s.length() && s.charAt(i) == 'Y') { 
    ++i; 
    } 
} 
return i == s.length(); 
+0

Большое спасибо! – Michael

+0

Счастье! Я не знал об этой функции :) – Michael

0

Вы можете использовать следующее регулярное выражение для определения конкретного шаблона.

String pattern = "^(X){1,}Y*$"; 

Вот полный код Java,

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class PatternMatch { 
    public static void main(String[] args){ 
     // String to be scanned to find the pattern. 
     String line = "XXXXY"; 
     String pattern = "^(X){1,}Y*$"; 

     // Create a Pattern object 
     Pattern r = Pattern.compile(pattern); 

     // Now create matcher object. 
     Matcher m = r.matcher(line); 
     if (m.find()) { 
      System.out.println("Found value: " + m.group(0)); 
     } else { 
      System.out.println("NO MATCH"); 
     } 
    } 
} 
+0

Большое спасибо! – Michael

+0

Вам не нужна соответствующая группа вокруг 'X'; '+' - более сжатый способ указать этот квантификатор; вы также можете использовать 'matches' вместо' find', так как вы ищете целое совпадение строк. –

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