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);
答案 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;到firstNumber
和firstVowel
,这不是你想要的。
但是,如果你只有一个元音,那么你的程序将会工作#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的另一个解决方案。