2016-09-27 50 views
0

我正在尝试接受用户输入并进行修改,以便打印没有任何元音的字符串。我已经能够用下面的代码成功地完成了。打印UI不使用元音使用循环不使用replaceAll();在Java中

Scanner in = new Scanner(System.in); 
    System.out.println("Enter a word: "); 
    String word = in.next(); 

    String newString = word.replaceAll("[aeiouAEIOU]","1"); 
    System.out.printf("%s", newString); 

但是,我试图通过使用没有上述方法replaceAll()的循环来获得相同的效果。我已经尝试了另外一次,但在逻辑中混淆并重新启动。我最近的尝试是在下面,我不明白为什么它不能正常运行。我会输入一个字符串,并且没有任何错误信息,它将不会打印回任何东西。我得到它的工作的唯一的一次是当我给它的单个字符的字符串中找到使用类似

if(letter.contains("a")) 

如果发现情况属​​实,将打印回的串,但是,这并不适用于任何字符组合,只有单个字符。我的完整代码如下。

import java.util.Scanner; 

public class practice 
{ 
    public static void main(String[] args) 
    { 
    Scanner in = new Scanner(System.in); 
    System.out.println("Enter a word: "); 
    String word = in.next(); 
    int i = 0; 

    while (i < word.length()){ 
     String letter = word.substring(i, (i+1)); 
     if(letter.contains("[bcdfghjklmnpqrstvwxyz]")){ 
      System.out.printf("%s",letter); 
     } 
     i++; 
    } 
    } 
} 

我只是想找到一种方法来完成这个程序只使用条件,循环,UI,只有方法长度(),包含()或的indexOf()的charAt(),和子( X,Y)。预先感谢任何帮助,我希望我已经提供了足够的信息。

下面是一些示例输出:

Enter a word: 
Jordan 

我输入的词后,程序停止。

+0

字符串' “B”'(例如)不能包含字符串' “bcdfghjklmnpqrstvwxyz”' 。太短了。 – ajb

+0

对不起,我编辑并在我正在寻找的字母周围添加[]。不幸的是仍然是同样的错误,没有得到任何输出。我在问题中提供了一个示例输出,希望能稍微澄清一点,谢谢。 –

+0

'contains'不使用正则表达式,并且使用'[]'创建正则表达式。不过,你可以使用'contains()'来解决问题,并且我认为你是在正确的轨道上,但是犯了一个小错误。您可以对原来的代码进行简单的更改(没有'[]')。想一想。 – ajb

回答

1

一种方法是将字符串转换为字符toCharArray(),然后用情况相比,数组,并添加一个新的链的StringBuilder

String word = in.next(); 
    StringBuilder bul = new StringBuilder(); 
    for (char arg : word.toLowerCase().toCharArray()) { 
     switch(arg) 
     { 
      case 'a': System.out.println("A");break; 
      case 'e': System.out.println("E");break; 
      case 'i': System.out.println("I");break; 
      case 'o': System.out.println("O");break; 
      case 'u': System.out.println("U");break; 
      default: 
       bul.append(arg); 
     } 
    } 
    System.out.println(bul); //String not Vowels 

在你的代码可能会改变,为什么用subtring所选字符绝不能包含这样的一长串这样"[bcdfghjklmnpqrstvwxyz]"

if(letter.contains("[bcdfghjklmnpqrstvwxyz]")){...} 

if("[bcdfghjklmnpqrstvwxyz]".contains(letter.toLowerCase())){...} 
+0

更改if语句,并感谢您使用其他方法。你能解释一下为什么后一种创建contains()方法的方法起作用,而不是我创建的方法?我只是想学习一切的细节,以便尽可能地理解。谢谢。 –

+0

因为我的确使用'substring()'作为字符串的一个字符,然后想知道该字符是否包含整个字符串'“[bcdfghjklmnpqrstvwxyz]”'逻辑'n'不能包含'n + n'个字符那总是'返回false',否则它会询问'n'是否包含'n-1',这是最合理的并且更可能返回'true' – DarkFenix

0

您可以使用Scanner.useDelimeter(Pattern pattern)regex。该regex去除元音 - [^ aeiou]同时+

如果你想忽略大小写然后用这个模式 - (我)[^ aeiou]同时+

最后试试下面的代码片段 -

scanner.useDelimeter(Pattern.compile("[^aeiou]+")); 
0

当你说,

if(letter.contains("bcdfghjklmnpqrstvwxyz")) 

你的代码将检查是否letter有字母的精确序列bcdfghjklmnpqrstvwxyz

换句话说,它不会检查这些字母是否存在于String中。

相反,你可以是这样的:

for (int i = 0; i < word.length(); i++) { 
     String currentLetter = String.valueOf(word.charAt(i)); 
     if (!currentLetter.matches("a|e|i|o|u")) 
      System.out.print(currentLetter); 
    } 
0

做的另一种方式是

Scanner s = new Scanner(System.in); 
System.out.print("Enter input String"); 
String input = s.next(); 
StringBuilder sb = new StringBuilder(""); 

for(char c : input.toLowerCase().toCharArray()) 
    if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'){} 
    else sb.append(c+"");' 

System.out.println("Given input without vowels : "+sb);