2013-12-09 2 views
0

Мне нужно написать программу, которая берет строку, и печатает текст строки со всеми удаленными гласными, за исключением случаев, когда начинается слово с ним.Код, который должен печатать строку сканера без гласных

Код, который я написал, находится на полпути, но я не могу понять, почему он не вернет всю строку и не удалит все гласные. Скажем, я вводил фразу «Желаемая область собственности». Программа печатает строку «Dirlp» вместо «Dsrbl prprty ar»

Может ли кто-нибудь посоветовать, как я могу улучшить код, чтобы сделать эту работу? Спасибо!

Вот мой код:

public static void main (String [] args) 
{ 
    Scanner in = new Scanner (System.in); 
    System.out.print ("Enter some text, then hit enter: "); 
    String text = in.nextLine(); 

    takeOutVowel (text); 
    System.out.println(); 
} 

static void takeOutVowel (String s) 
{ 
    char ch = s.charAt(0);        //character to be printed 
    System.out.print (ch); 
    int nextCh = 1;         //determines the position of the next character 
    int increase = 1;        //increase is how much i will increase by in the for loop; takes the position of vowels into              //consideration so they can be skipped 

    for (int i = 1; i <= s.length(); i += increase) 
    { 
     ch = s.charAt (nextCh); 

     if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') 
     { 
      nextCh++; 
      ch = s.charAt (nextCh); 

      while (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u'); 
      { 
       nextCh++; 
       ch = s.charAt (nextCh); 

       if (nextCh >= s.length()) 
       { 
        ch = ' '; 
        break;   
       } 

      } 
     } 

     System.out.print (ch); 
     nextCh++; 
     ch = s.charAt (nextCh); 

     if (ch == ' ')         //if the previous position was a space, then this will allow for the vowel to be printed 
     { 
      System.out.print ("" + ch + s.charAt(nextCh + 1)); 
      nextCh++; 
     } 

     increase = nextCh; 


    } 

Спасибо за все ответы до сих пор - очень полезно! Мне не разрешено использовать массивы или что-то еще не охваченное, поэтому я изменил код на то, что он ниже. Это компилируется нормально, но когда я запускаю программу и введите текст сканера, я получаю сообщение о том,

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 27 
at java.lang.String.charAt(String.java:686) 
at Vowels.noVowels(Vowels.java:20) 
at Vowels.main(Vowels.java:11) 

Я не могу понять, в чем проблема сейчас. Еще раз спасибо за помощь!

import java.util.*; 

class Vowels 
{ 
    public static void main (String [] args) 
    { 
     Scanner in = new Scanner (System.in); 
     System.out.print ("Enter some text, then hit enter: "); 
     String text = in.nextLine(); 

     System.out.println (noVowels(text)); 
    } 

    static String noVowels (String s) 
    { 
     String noVowels = "" + s.charAt(0);     //Starts a new string with the first character of the input text 

     for (int i = 1; i <= s.length(); i++) 
     { 
      if (isVowel(s.charAt(i)) && s.charAt(i-1) != ' ')  //if the character is a vowel and it's previous character wasn't a space, then this is a vowel to be            replaced 
      { 
       noVowels = noVowels.concat(""); 
      } 

      else 
      { 
       noVowels = noVowels.concat("" + s.charAt(i)); 
      } 
     } 

     return noVowels; 
    } 

    static boolean isVowel (char ch) 
    { 
     if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') 
     { 
      return true; 
     } 

     else 
     { 
      return false; 
     } 
    } 
} 
+0

http://stackoverflow.com/questions/4430112/how-do-i-remove-some-characters-from-my-string (я имею в виду, вы могли бы просто иметь простое регулярное выражение с каждым гласным. ..) – Shiki

+0

Если слово начинается с гласного, вам не нужно удалять какие-либо гласные с этого слова? – Adarsh

+0

Я предполагаю, что ваш индекс выходит за пределы диапазона, потому что в вашем цикле 'for' у вас есть ваше условие как' i <= s.length(); '. Скажем, ваша строка «hello» - длина 5, но 's.charAt (5)' не существует. Максимальное положение в массиве - 4. –

ответ

1

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

static void takeOutVowel(String s) { 
    StringBuilder res = new StringBuilder(); 
    String[] words = s.split(" +"); 
    for (String word : words) { 
     res.append(word.charAt(0)); //Skip the first char 
     for (int i = 1; i < word.length(); i++) { 
      char ch = word.charAt(i); 
      if (!isVowel(ch)) { // Check the vowel 
       res.append(ch); 
      } 
     } 
     res.append(' '); 
    } 

    System.out.println(res); 
} 

static boolean isVowel(char ch){ 
    ch=Character.toLowerCase(ch); // Make it case-insensitive. 
return ch=='a' ||ch=='e' ||ch=='i' ||ch=='o' ||ch=='u'; 
} 
+0

Это было очень полезно, спасибо! Я не могу использовать массивы, это проблема. Есть ли другой способ? – srsarkar7

1

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

public static void main(String[] args) 
{ 
    String noVowels = takeOutVowel("Hello how are you?"); 
    System.out.println(noVowels); // prints "Hll hw r y?" 
} 

// This will remove all vowels from any String 
private static String takeOutVowel(String s) 
{ 
    return s.replaceAll("[aeiou]", ""); 
} 

Но теперь, чтобы удовлетворить ваше требование не обращая внимания на первую букву слова, если это гласный (что означает, что мы не будем игнорировать того, что нет), вам просто нужно изменить метод takeOutVowel немного.

static String takeOutVowel (String s) 
{ 
    // split your string so we can examine each word separately 
    String[] words = s.split(" "); 
    String noVowels = ""; 

    for (int i = 0; i < words.length; i++){ 
     char firstChar = words[i].charAt(0); 
     String temp = words[i].substring(1, words[i].length()).replaceAll("[aeiou]", ""); 
     noVowels += firstChar + temp + " "; 
    } 

    return noVowels; 
} 
+0

Как вы пропустите первый символ? Согласно требованию OP, результат должен быть похож на 'Hll hw ar y?' – Masudul

+0

@Masud Вы правы, я остеклен над этим требованием. Я напишу что-нибудь и отредактирую свой ответ. Спасибо, что заметили! –

+0

@ adback03 большое спасибо за вашу помощь! Мне не разрешено использовать массивы для этой программы. Вы знаете альтернативный метод? еще раз спасибо – srsarkar7

0

Это работает для вашего следующего требования - Удалите все гласные, за исключением случаев, когда слово начинается с гласного.

import java.util.Scanner; 

public class Test { 

public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    System.out.print("Enter some text, then hit enter: "); 
    String text = in.nextLine(); 
    takeOutVowel(text); 
    System.out.println(); 
} 

static void takeOutVowel(String s) { 
    String[] array = s.split(" ");       // Split sentence into words and store them in an array. 
    StringBuilder finalString = new StringBuilder(); 
    for (String word : array) {        //For each word in the array 
     char ch = word.toLowerCase().charAt(0);    //check if the lower case first character is a vowel. 
     if(ch != 'a' && ch != 'e' && ch != 'i' && ch != 'o' && ch != 'u'){ // When it is not, replace all the vowels. 
      finalString = finalString.append(word.replaceAll("[aeiou]", "")).append(" "); 
     }else{ 
      finalString = finalString.append(ch).append(word.replaceAll("[aeiou]", "")).append(" ");// When it is , replace all the vowels except the first character. 
     } 
    } 
    System.out.println(finalString); 
} 
} 
Смежные вопросы