1

ここに、段落を入力してファイルに書き込むプログラムがあります。その後、各文字の出現回数をカウントする必要があります(大文字と小文字が区別されます)。ただし、文字の出現回数はカウントされません。 forループを間違った場所に置いたと思います。

import java.io.*;
import java.util.*;
public class Exercise1 {

    public static int countLetters (String line, char alphabet) {
        int count = 0;
        for (int i = 0; i <= line.length()-1; i++) {
            if (line.charAt(i) == alphabet)
                count++;
        }
        return count;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader buffer = new BufferedReader (new InputStreamReader(System.in));
        PrintWriter outputStream = null;
        Scanner input = new Scanner (System.in);
        int total;

        try {
            outputStream = new PrintWriter (new FileOutputStream ("par.txt"));
            System.out.println("How many lines are there in the paragraph you'll enter?");
            int lines = input.nextInt();
            System.out.println("Enter the paragraph: ");
            String paragraph = buffer.readLine();
            outputStream.println(paragraph);
            int j;
            for (j = 1; j<lines; j++) {
                paragraph = buffer.readLine();
                outputStream.println(paragraph);    
            }
            outputStream.close();
            System.out.println("The paragraph is written to par.txt");

            for (int k=1; k<lines; k++) {
                paragraph = buffer.readLine();
                total = countLetters (paragraph, 'A');
                if (total != 0)
                    System.out.println("A: "+total);
                            //I'll do bruteforce here up to lowercase z

            }
        }

        catch(FileNotFoundException e) {
            System.out.println("Error opening the file par.txt");
        }

    }

}

コードの修正を手伝ってください。私はプログラミングが初めてで、助けが必要です。どうもありがとうございます!

4

4 に答える 4

6

まず、最初に読み取るユーザー入力は、一度読んだ後、残りのforループに入るので少し無駄です。これは問題ではなく、より良いコードです。

// your code
String paragraph = buffer.readLine();
outputStream.println(paragraph);
int j;
for (j = 1; j<lines; j++) {
     paragraph = buffer.readLine();
     outputStream.println(paragraph);    
 }

あなたはそれらをループに入れることができます:

// better code
String paragraph;
int j;
for (j = 0; j<lines; j++) {
     paragraph = buffer.readLine();
     outputStream.println(paragraph);    
}

次に、最初の問題は、行の読み方にあります。

// your code - not working
outputStream.close();
for (int k=1; k<lines; k++) {
      paragraph = buffer.readLine();
      total = countLetters (paragraph, 'A');

上記で何が起こったかを考えてみましょう。

  • 入力はすでに完了しており、出力はすでに書き込まれており、ストリームは閉じられています-ここまではすべてが良好です
  • 次に、文字数を数えようとすると、次のようになります。-paragraph = buffer.readLine();このコードは何をしますか?(挿入されたものを読み取る代わりに)別のユーザー入力を待機します

上記の問題を修正するには、すでに書かれているものから読み取る必要があります。別の入力を要求するのではありません。次に、すべての文字を1つずつブルートフォースする代わりに、それらをリストに入れてforループを作成できます。

したがって、ここで、すでに作成した既存のファイルから読み取ります(つまり、ユーザーが入力したものを読み取ります)。

BufferedReader fileReader = new BufferedReader(new FileReader(new File("par.txt")));

String allCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
String aLineInFile;

// Read the file that was written earlier (whose content comes from user input)
// This while loop will go through line-by-line in the file
while((aLineInFile = fileReader.readLine()) != null)
{
      // For every line in the file, count number of occurrences of characters  
      // This loop goes through every character (a-z and A-Z)  
      for(int i = 0; i < allCharacters.length(); i++)
      {
            // For each single character, check the number of occurrences in the current line
            String charToLookAt = String.valueOf(allCharacters.charAt(i));
            int numOfCharOccurancesInLine = countLetters (aLineInFile, charToLookAt);

            System.out.println("For line: " + aLineInFile + ", Character: " + charToLookAt + " appears: " + numOfCharOccurancesInLine + " times " );
      }         
}

上記は、すべての行のすべての文字の出現回数を示しています。ファイル全体の合計数を追跡するために、それらを整理する必要があります。

コード的には、これを記述してよりクリーンな実装にするためのより良い方法があるかもしれませんが、上記は理解しやすいです(そして私はそれを非常に迅速に記述しました)。

于 2012-07-18T14:53:38.987 に答える
0

すべてを1つのループで実行します。

       for (j = 1; j<lines; j++) {
            paragraph = buffer.readLine();
            total = countLetters (paragraph, 'A');
            if (total != 0)
                System.out.println("A: "+total);
            outputStream.println(paragraph);    
        }
于 2012-07-18T14:41:02.327 に答える
0

HashTableを使用して、各ケースの感傷的な文字をカウントできます。

        final Pattern patt = Pattern.compile("A-Za-z]");
        final HashMap<Character, Integer> tabChar = new HashMap<Character, Integer>(
            52);

        // replace : paragraph = buffer.readLine();
        // Unless you use it outside, you can declare it 'final'
        final char[] paragraph = "azera :;,\nApOUIQSaOOOF".toCharArray();


        for (final Character c : paragraph ) {
            if (Character.isLetter(c)) {
                Integer tot = tabChar.get(c);
                tabChar.put(c, (null == tot) ? 1 : ++tot);
            }
        }

出力:

{F=1, A=1, O=4, I=1, U=1, Q=1, S=1, e=1, a=3, r=1, p=1, z=1}

を使用final TreeSet<Character> ts = new TreeSet(tabChar.keySet());して文字を並べ替えget(c);てから、tabChar

于 2012-07-18T15:05:00.313 に答える
0

前の回答で問題は解決しましたが、ブルートフォースを回避する別の方法は、ASCII文字値を使用するループを使用することです。

于 2012-07-19T03:26:00.340 に答える