charAt(0)不返回第一个数字而是返回第二个数字

时间:2017-06-03 21:24:53

标签: java

Piglatin translator。最后我试图得到第一个元音的位置。索引设置为每个元音的位置,但是对于拉丁语,您只需要第一个元音的位置。当我运行程序时,我不总是得到第一个元音的位置。它似乎给了我第二个数字而不是第一个数字。

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);

3 个答案:

答案 0 :(得分: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才能正常工作。

答案 1 :(得分: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();

                        }
                    }
                }
            }
        }

我就是这样做的。我将元音String更改为ArrayList,这样您就可以轻松检查带有索引的String字中的char是否为元音,代码是否正常工作。它会返回第一个元音所在的索引以及它的元音。

答案 2 :(得分:0)

我可以看到一些问题,但可能导致此错误的问题在于:

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

想想这是做什么的。首先,你从索引值中取出String,然后你说第一个元音是该字符串的第0个索引。

想想这个例子:你好

程序将运行并分配&#34; 4&#34;到firstNumberfirstVowel,这不是你想要的。

但是,如果你只有一个元音,那么你的程序将会工作#34;

如果你有超过十个元音会怎样?我知道这不是一个现实的例子,但是说它发生了。您的程序会将最后一个元音的索引分配给firstNumber(比如说​​15),然后它会将该字符的第一个字符分配给firstVowel(1)。这根本没有多大意义,特别是如果你没有索引1中的元音。

对于长度小于10个字母的单词,您遇到的主要问题是您不只是输出第二个数字,而是输出最后一个数字。我喜欢处理这个问题的一种方法是浏览代码并放入打印语句,我不确定某个值是什么。例如,我在你的循环中添加了另一个打印语句,告诉你你正在查看的是什么字母,如下所示:

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

这可以帮助您避免混淆。解决这个问题的正确方法是使用break语句,例如在Darshan的答案中。或者,您可以使用for循环的属性:

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

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

所以简而言之,你需要修改帖子开头的两行,你需要找到一种方法来找到第一个元音时打破你的循环。这里给出了一个解决方案,Darshan Mehta的另一个解决方案。