这是用于Java猪拉丁语翻译作业的。我是Java的新手,对此问题有很多困难。当我输入要读取和写入的文件时,出现数组索引超出范围错误。在这一点上,我什至不确定代码的翻译部分是否可以正常工作。对于纠正错误和翻译器代码的任何帮助,将不胜感激。
while(true){
System.out.println("Enter a text file to translate to Pig Latin. Quit to end.");
fileName = keyboard.nextLine();
if (fileName.equalsIgnoreCase("quit")){
break; //End program.
}
System.out.println("Enter a file to write the translated file to.");
outputFile = keyboard.nextLine();
if (outputFile.equalsIgnoreCase("quit")){
break; //End program.
}
fileToTranslate = new File(fileName);
try {
fileReader = new Scanner(fileToTranslate);
} catch (FileNotFoundException ex) {
//Logger.getLogger(PigLatinTranslatorKukuruda.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("File does not exist. Enter a new file.");
}
while(fileReader.hasNext()){
word = fileReader.next();
}
fileReader.close();
System.out.println(translator(word));
}
}
public static String translator(String string){
String[] wordsToTranslate = string.split(" ");
String word;
String translatedString = " ";
int first = 0;
for(int i = 0; i <= wordsToTranslate.length-1; i++){
word = wordsToTranslate[1];
if ((word.charAt(0) == 'a') || (word.charAt(0) == 'e') || (word.charAt(0) == 'i') ||
(word.charAt(0) == 'o') || (word.charAt(0) == 'u') || (word.charAt(0) == 'A') ||
(word.charAt(0) == 'E') || (word.charAt(0) == 'I') || (word.charAt(0) == 'O') ||
(word.charAt(0) == 'U')){
translatedString = word + "yay";
}
else{
for(int j = 0; j <= word.length()-1; j++){
if ((word.charAt(j) == 'a') || (word.charAt(j) == 'e') || (word.charAt(j) == 'i') ||
(word.charAt(j) == 'o') || (word.charAt(j) == 'u') ||
(word.charAt(j) == 'A') || (word.charAt(j) == 'E') ||
(word.charAt(j) == 'I') || (word.charAt(j) == 'O') ||
(word.charAt(j) == 'U')){
if (first == 0){
translatedString = word.substring(j) + word.substring(0, j) + "ay";
first = 1;
}
}
}
}
}
return translatedString;
}
现在我只是收到错误信息,不确定该怎么办。这应该写入文件,但是我现在正试图将其输出,以查看它是否有效,但是由于错误,我没有走那么远。谢谢
答案 0 :(得分:2)
请考虑以下代码部分:
while(fileReader.hasNext()){
word = fileReader.next();
}
fileReader.close();
System.out.println(translator(word));
您的扫描仪正在逐字读取(因为.next()
)。
在while循环内,您每次迭代都会覆盖word
的值,因此在循环结束时,word
将等于文件的最后一个字< / strong>。
因此,您对translate(word)
的调用只会传递最后一个单词作为参数。即一个字。因此,word = wordsToTranslate[1];
肯定会抛出IndexOutOfBounds
异常,因为没有第二个单词。
再加上,我相信您打算在循环中使用word = wordsToTranslate[i];
吗?
答案 1 :(得分:1)
Anis R.是正确的,但回答您的下一个问题(如何翻译每个单词):
读完每个单词后,应将其添加到任何数组(或ArrayList或类似的数组)中。然后,您可以将所有单词的数组传递给翻译器类。
如果您希望将每个单词都读成一个字符串,就像您尝试在代码中所做的那样,则需要更改
word = fileReader.next();
到
word += fileReader.next();
这会将下一个单词附加到字符串中。
编辑:谢谢Anis R,它一定是
word += " " + fileReader.next();
正确包含空格。
要回答有关ArrayLists的后续问题: 为这样的单词创建一个ArrayList:
ArrayList<String> list = new ArrayList<String>();
然后,在您的while(fileReader.hasNext())
循环内,将代码更改为list.add(fileReader.next());
这会将每个单词(不带空格)添加到列表中-每个单词将是一个单独的字符串以及列表中的唯一索引。然后,您可以遍历列表(可以使用list.size()
找到长度)来翻译每个单词。由于不包括空格,因此在打印输出的结果时,您需要在每个单词之间打印空格。