2

そして。問題のない try-catch ブロックがありますが、テキスト ファイルの最初の行をインポートすると、文字列インデックスが範囲外です:33 と表示されます。

その行は「The Dentist Pulled My Tooth Out」です。私が行っているのは、for ループを使用して、行の最後に到達するまで、行内のすべての文字を評価することです。文字が母音の場合、母音整数をインクリメントします。それ以外の場合は、空白のスペースをチルダ (~) に変更します。私が知りたいのは、文字列が範囲外であると表示される理由と、テキスト行の空白をファイルからチルダに変更する方法です。自分で別のファイルに出力することを理解できます(それが私がしなければならないことです)。なぜ範囲外だと言っているのか混乱しています。以下にプログラム全体を貼り付けました。

このプログラムの目的は、テキスト ファイルを 1 文字ずつ評価し、母音の数を数えることです。また、空白をチルダに変更してから、別のテキスト ファイルに再出力する必要があります。

コードは以下のとおりです。

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

を使用して、長い 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

2番目の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 に答える