2017-02-20 6 views
0

У меня есть код, который проверяет наличие трех одинаковых последовательных согласных в строке. Это выглядит так:Проверка на наличие каких-либо 3-х скрытных согласных

String cons = "bcdfghjklmnpqrstvwxyz"; 
    char[] consonants = cons.toCharArray(); 

     int z = 0; 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Enter your word!"); 
     String word = scan.next().toLowerCase(); 
     int length = word.length(); 
     char[] ch = word.toCharArray(); 
     for (int i = 0; i < length-2; i++) { 
      for (int j = 0; j < 21; j++) { 
       if ((ch[i] == consonants[j]) && 
         (ch[i + 1] == consonants[j]) 
         && (ch[i + 2] == consonants[j])) { 
        z++; 
        break; 
       } 
      } 
      if (z == 1) 
       break; 
     } 
     if (z == 1) { 
      System.out.println("Three consecutive consonants here!"); 
     } else { 
      System.out.println("It is fine!"); 
     } 

Но я хотел бы проверить ЛЮБОЕ три последовательных согласных. Чтобы найти такие слова, как: Рождество, страна, дети, школа и т. Д.

И не знаю, как мне изменить этот код, чтобы сделать это. Вы можете помочь?

+0

Что вы имели в виду, вы хотели проверить, например, 'bcd' существуют три раза в вашей строке или что? –

+0

Только один раз - три последовательных согласных –

+0

Я действительно не могу прийти, чтобы понять ваш вопрос, можете ли вы привести пример, чтобы я мог понять? –

ответ

1

На мой взгляд, лучший способ сделать это - это перебрать слово, которое вы хотите искать по символу. Каждый раз, когда письмо, которое вы сейчас находитесь, находится в согласном массиве, добавьте его в z. Каждый раз, когда письмо, в котором вы сейчас находитесь, находится не в согласных массивах, установите z в ноль. Если в любой момент z равно трем, вы знаете, что строка, которую вы ищете, имеет 3 согласных подряд, и вы можете вырваться из циклов. Если вы получите конец цикла, а z никогда не достигали трех, вы знаете, что строка, которую вы ищете, не имеет трех последовательных согласных. Надеюсь, это помогло, и удачи в кодировании!

1

Вы должны посмотреть документацию по String, особенно метод contains().

1

Я думаю, что будет легче управлять, если вы объявите себе вспомогательный метод, например private static boolean isConsonant(char ch). Этот метод будет содержать цикл над вашим массивом consonants, а return true - это тот же аргумент, что и один из согласных.

Теперь в вашей основной программе вы можете перебирать символы введенного слова, сохраняя количество последовательных согласных. В качестве примера возьму country. Вы принимаете c, ваш метод должен сказать вам, что это согласный, поэтому увеличьте количество до 1. o нет, поэтому сбросьте до нуля. Сделайте то же самое для u (ничего не меняет, но проще всего это сделать). Теперь приходят n, t и r, поэтому ваш счет увеличивается до 1, затем 2, затем 3. Когда он достигает 3, вы закончите, так как знаете, что у вас есть 3 последовательных согласных.

Внутри вашего цикла вы будете называть свой метод в if - else заявление как if (isConsonant(ch)) ... Вы будете иметь другое if заявление, чтобы увидеть, если счетчик равен 3 - либо внутри, либо после того, как первый.

1

Вы спрашивали о том, как ваш код может быть изменен, чтобы сделать его работу, поэтому следующий основан на коде и будет работать:

String cons = "bcdfghjklmnpqrstvwxyz"; 
char[] consonants = cons.toCharArray(); 

int z = 0; 
Scanner scan = new Scanner(System.in); 
System.out.println("Enter your word!"); 
String word = scan.next().toLowerCase(); 
int length = word.length(); 
char[] ch = word.toCharArray(); 
for (int i = 0; i < length; i++) { 
    boolean isConsonant = false; 
    for (int j = 0; j < 21; j++) { 
     if (ch[i] == consonants[j]) { 
      isConsonant = true; 
      break; 
     } 
    } 
    if (isConsonant) { 
     z++; 
     if (z == 3) 
      break; 
    } else { 
     z = 0; 
    } 
} 
if (z == 3) { 
    System.out.println("Three consecutive consonants here!"); 
} else { 
    System.out.println("It is fine!"); 
} 

Код теперь проверяет символ на гольца, если это один из согласные. Если это согласный счетчик z увеличивается. Как только счетчик достигнет 3, цикл for завершает работу и всякий раз, когда найден символ, который не является согласным, счетчик сбрасывается на ноль.

Но проверка может быть очень легко осуществить с помощью регулярных выражений:

Scanner scan = new Scanner(System.in); 
System.out.println("Enter your word!"); 
String word = scan.next().toLowerCase(); 
if (Pattern.compile("[a-z&&[^aeiuo]]{3}").matcher(word).find()) { 
    System.out.println("Three consecutive consonants here!"); 
} else { 
    System.out.println("It is fine!"); 
} 

[a-z] любой символ от а до г, [^aeiuo] любой символ, кроме гласных звуков. Пересечение обоих выполняется с использованием &&, и полученный результат [a-z&&[^aeiuo]] представляет собой согласные.Когда мы ищем три последовательных согласных, соответственно добавляется {3}.

Здесь вы можете найти подробную информацию о регулярных выражениях: http://www.regular-expressions.info

+0

Спасибо большое! Будет ли эта версия регулярного выражения работать для русского варианта? Если я напишу это как ... Pattern.compile ("[а-я && [^ aeёиоуыя]] {3}"). Matcher (word) .find()) –

1

Там нет необходимости использовать вложенные для цикла. Вы можете добиться этого, используя indexOf() API, чтобы проверить, присутствует ли значение в строке согласных или нет.

String cons = "bcdfghjklmnpqrstvwxyz"; 


     int z = 0; 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Enter your word!"); 
     String word = scan.next().toLowerCase(); 
     //int length = word.length(); 
     char[] ch = word.toCharArray(); 
     for (int i = 0; i < ch.length-2; i++) { 

       if (
         cons.indexOf(ch[i])!=-1 && 
         cons.indexOf(ch[i+1])!=-1 && 
         cons.indexOf(ch[i+2])!=-1 
        ) 
       { 
        z++; 
        break; 
       } 
       if (z == 1) 
       break; 
     } 
     if (z == 1) { 
      System.out.println("Three consecutive consonants here!"); 
     } else { 
      System.out.println("It is fine!"); 
     } 
     } 
+0

Большое спасибо за рассказ об этом методе. –

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