2017-06-03 125 views
0

明胶翻译器。最后,我试图获得第一个元音的位置。索引被设置为每个元音的位置,但对于拉丁语,只需要第一个元音的位置。当我运行程序时,我并不总是得到第一个元音的位置。它似乎给了我第二个数字,而不是第一个。charAt(0)不返回第一个数字,而是第二个

import java.util.Scanner; 
import javax.swing.JOptionPane; 

public class Assignment_4_Piglatin { 

    public static void main(String[] args) { 

     Scanner userWord = new Scanner(System.in); 

     System.out.println("K. Caleb Swallow"); 
     System.out.println("Welcome to the Pig Latin Translator!"); 

     boolean run = true; 
     while (run) { 

      System.out.println("Please enter a word(or press Q to quit):"); 

      String firstLetter = "something"; 
      String firstVowel = "test"; 

      String word = userWord.next(); 
      String vowels = "aeiou"; 
      if (word.equals("Q")) { 
       System.exit(0); 
      } 

      firstLetter = Character.toString(word.charAt(0)); 

      if (firstLetter.equals("a") || firstLetter.equals("e") || firstLetter.equals("i") || firstLetter.equals("o") || firstLetter.equals("u")) { 
       System.out.println(word + "way"); 
      } else { 
       for (int index = 0; index < word.length(); index++) { 
        if (vowels.contains(String.valueOf(word.charAt(index)))) { 
         System.out.print(index); 
         String firstNumber = Integer.toString(index); 
         firstVowel = Character.toString(firstNumber.charAt(0)); 

        } 
       } 

      } 
      System.out.println(firstVowel); 
+0

尝试格式化您的代码,然后发布到此处(例如http://www.freecodeformat.com/java-format.php) –

+0

是否将大写字母视为您程序的有效输入? – MrMister

+0

在找到第一个元音之后添加一个break语句,以便for循环停止迭代。 –

回答

0

该示例似乎在if..else条件下有一些冗余代码。如果你要打印的第一元音,那么你可以用一个简单的循环for做到这一点,例如:

String word = userWord.next().toLowerCase(); 
String vowels = "aeiou"; 
for(int i=0 ; i<word.length() ; i++){ 
    if(vowels.contains(String.valueOf(word.charAt(i)))){ 
     System.out.println(word.charAt(i)); 
     break; 
    } 
} 

请注意,你需要做的toLowerCase实际字,以便contains工作。

0

public static void main(String[] args) {

  Scanner userWord = new Scanner(System.in); 

      System.out.println("K. Caleb Swallow"); 
      System.out.println("Welcome to the Pig Latin Translator!"); 

      boolean run = true; 
      while (run) { 

       System.out.println("Please enter a word(or press Q to quit):"); 

       String firstLetter = "something"; 
       String firstVowel = "test"; 

       String word = userWord.next(); 
       ArrayList<Character> vowels = new ArrayList<>(); 
       vowels.add('a'); 
       vowels.add('e'); 
       vowels.add('i'); 
       vowels.add('o'); 
       vowels.add('u'); 
       if (word.equals("Q")) { 
        System.exit(0); 
       } 

       firstLetter = Character.toString(word.charAt(0)); 

       if (firstLetter.equals("a") || firstLetter.equals("e") || firstLetter.equals("i") || firstLetter.equals("o") || firstLetter.equals("u")) { 
        System.out.println(word + "way"); 
       } else { 
        for (int index = 0; index < word.length(); index++) { 
         char indchar = word.charAt(index); 
         if (vowels.contains(word.charAt(index))) { 
          System.out.println(index); 
          firstVowel = Character.toString(word.charAt(index)); 
          System.out.println(firstVowel); 
          index = word.length(); 

         } 
        } 
       } 
      } 
     } 

这是我会怎么做。我将元音字符串更改为一个ArrayList,以便您可以轻松检查包含索引的字符串中的字符是否为元音,并且代码工作得非常好。它会返回第一个元音所在的索引和元音。

+0

在这种情况下,我会使用break而不是在这里返回,因为看起来作者希望程序循环直到输入“Q”。 –

+0

我认为这仍然会返回最后一个元音而不是第一个元音。插入“break”在if语句的结尾将解决这个问题。 –

+0

我工作正常。它总是返回你输入的单词的第一个元音。而break等于index = word.length();因为两者都会停止for循环。 –

0

有几个问题,我可以看到了蝙蝠,但很可能导致此错误之一是在这些线路:

String firstNumber = Integer.toString(index); 
firstVowel = Character.toString(firstNumber.charAt(0)); 

想想这是什么做的。首先,你在String以外的索引值,那么你说第一个元音是在该字符串的第0个索引。

觉得这个例子:你好

程序将运行并指定“4” firstNumberfirstVowel这是不是你想要的。

但是,如果你只有一个元音,你的程序将“工作”。

如果你有超过十个元音会发生什么?我知道这不是一个现实的例子,但说它发生。你的程序会把最后一个元音的索引分配给firstNumber(比如说15),然后它会把第一个字符赋给firstVowel(1)。这一点没有什么意义,特别是如果你没有索引1中的元音。

你遇到的长度小于10个字母的单词的主要问题是你不只是输出第二个数字,则输出最后一个数字。我喜欢处理这个问题的一种方法是通过代码并输入打印语句,我不确定某个值是什么。例如,我把另一个print语句在你的循环,它告诉你,你在看什么字母,像这样:

System.out.println("LETTER: "+ String.valueOf(word.charAt(index))); 

这将帮助你避免混淆。解决此问题的正确方法是使用break声明,例如Darshan的答案。或者,你可以使用的属性进行循环:

firstVowel = ""; 
for (int index = 0; index < word.length() && firstVowel == ""; index++) { 
CODE 
} 

注意,for循环的第二部分是一个条件语句。你已经知道这可以用来循环单词的字符,但你可以在那里插入任何你想要的逻辑语句。在本例中,我将firstVowel的默认值设置为""(将其设置为null是一个假人,但这是另一回事)。然后,每次循环运行时,它会检查firstVowel的值是否已更改,这当然会在第一次通过循环运行元音时发生。

简而言之,您需要在我的文章开头修改两行,并且您需要找到找到第一个元音时打破循环的方法。这里给出了一个解决方案,另一个解决方案是Darshan Mehta的帖子。

相关问题