2

可以,然后呢。我有一个没有问题的 try-catch 块,但问题是当我导入文本文件的第一行时,它说字符串索引超出范围:33。

那行是“牙医拔掉了我的牙”我正在做的是使用 for 循环来评估一行中的每个字符,直到我们到达所述行的末尾。如果字符是元音,那么我增加一个元音整数。否则,如果是空格,那么我将空格更改为波浪号(~)。我想知道的是为什么它说我的字符串超出范围以及如何将文本行中的空格从文件更改为波浪号。我可以自己弄清楚将其输出到不同的文件(这是我必须做的)。我只是很困惑为什么它说它超出范围。我在下面粘贴了我的整个程序。

该程序的目标是逐个字符地评估文本文件,并计算元音的数量。此外,我必须将任何空格更改为波浪号,然后重新输出到不同的文本文件。

代码如下:

import java.io.File;
import java.util.Scanner;
import java.io.IOException;
import java.io.FileWriter;

public class Vowels {

    public static void main(String[] args) {
        Scanner inFile;
        File dentist = new File("poetry.txt");
        int vowels = 0;

        try {

            for (int i = 0; i >= 0; i++) {
                inFile = new Scanner(new File("poetry.txt"));
                String str1 = inFile.nextLine();
                for (int a = 0; a >= 0; a++) {

                    String start;
                    start = str1.substring(a, a + 1);

                    if (start.equalsIgnoreCase("a") == true)
                        vowels++;
                    else if (start.equalsIgnoreCase("e") == true)
                        vowels++;
                    else if (start.equalsIgnoreCase("i") == true)
                        vowels++;
                    else if (start.equalsIgnoreCase("o") == true)
                        vowels++;
                    else if (start.equalsIgnoreCase("u") == true)
                        vowels++;
                    else if (start.equalsIgnoreCase(" "))
                        start = " ";

                }
            }
        } catch (IOException i) {
            System.out.println("Error");
        }

    }
}
4

5 回答 5

2

您应该new Scanner退出循环,然后将循环更改为while(inFile.hasNextLine())......您根本没有使用“i”。

此外,您的内部循环永远不会结束,这就是您遇到索引异常的原因。与其拥有a>=0,不如将其替换为a<str1.length()

用 替换该子字符串str1.charAt(a),然后使用简单的 == 将该字符(不是字符串)与单引号字符...'a'、'e'、'i' 等进行比较。char 是本机数据类型,所以你可以Character.toLowerCase(start) == 'a' 注意我在比较之前强制字符小写,这取代了“忽略大小写”。如果你只是说,你不必Character.toLowerCase每次都这样做start = Character.toLowerCase(start)

于 2013-11-04T05:35:41.700 回答
1

这段代码中发生了几件事。

for(int i = 0; i>=0; i++){
inFile = new Scanner(new File("poetry.txt")); 
String str1 = inFile.nextLine(); 
  1. 这将循环几乎 2^32/2 - 1 次。
  2. 每次都会创建一个新的 Scanner 对象。
  3. 您每次都是第一次阅读。

    for(int a = 0; a >= 0; a++) {
        String start; 
        start = str1.substring(a, a + 1); 
    }
    
  4. 这将再次循环 2^32/2 - 1 次。

    由于 str1 没有变量“a”那么大,因此它崩溃了。您需要将此循环设为

    for(int a = 0; a < (str1.length() - 1); a++) {
        String start = str1.substring(a, a + 1);
    }
    

这应该可以解决您的问题。

于 2013-11-04T05:37:29.343 回答
0

对于替换空白,当您将输入输入到一个字符串中时,只需使用

String my_new_str = my_str.replaceAll(" ", "~");

然后写回文件

字符串替换

于 2013-11-04T05:40:17.200 回答
0

您可以通过使用取消长 if-else 结构

String STR_VOWELS = "aeiou";
if(STR_VOWELS.contains(start)) {
    vowels++;
} else if (start.equals(" ")) {
    // you can remove this else as well, as you are not doing any thing different here.
    start = " "; 
}

希望这可以帮助。

于 2013-11-04T05:37:27.860 回答
0

尝试用以下代码替换第二个 for 循环,这将解决您的问题

 String str1 = inFile.nextLine(); 
          for(int a = 0; a < str1.length()-1; a++){ // a< string.length() otherwise   exception will occur
于 2013-11-04T05:37:39.617 回答