0

このコードの目的は、main メソッド java を使用して、ユーザーから入力された断片テキストを分析するプログラムを作成することでした。

彼らは、プログラムによって分析されるスキャナーにテキストを入力することによってこれを行います。分析では、単語の頻度、平均の長さを生成し、結果をアスタリスク グラフの形式で出力します。単一の「*」は 1 つの単語を表します。

たとえば、「Birds can Maybe fly」は次の結果を出力するはずです。

Enter Text:
Birds can maybe fly
Birds can maybe fly
3 letter words: 2
5 letter words: 2
mean length: 4.0
3 letter words: **
5 letter words: **
Enter Text:

しかし、代わりに私はこれを取得しています

Enter text: 
Birds can maybe fly
Birds can maybe fly
3 letter words: 2
3 letter words: *
mean lenght: 4.0
3 letter words: 2
3 letter words: **
mean lenght: 4.0
5 letter words: 2
5 letter words: *
mean lenght: 4.0
5 letter words: 2
5 letter words: **
mean lenght: 4.0
Enter text: 

コードを変更して、2 番目のセクションで得られたものではなく、最初のセクションで見たものを出力する方法はありますか。

コード:

import java.util.Scanner;

public class Freq
{

    public static void main(String[] args)
    {

        Scanner scan = new Scanner(System.in);

        while (true)
        {

            System.out.println("Enter text: ");

            String s;
            s = scan.nextLine();
            String input = s;
            String strippedInput = input.replaceAll("\\W", " ");

            System.out.println("" + strippedInput);

            String[] strings = strippedInput.split(" ");
            int[] counts = new int[6];
            int total = 0;

                for (String str : strings)
                    if (str.length() < counts.length)
                        counts[str.length()] += 1;
                for (String s1 : strings)
                    total += s1.length();   

                for (int i = 1; i < counts.length; i++){    
            StringBuilder sb = new StringBuilder(i).append(i + " letter words: ");
                    for (int j = 1; j <= counts[i]; j++) {


                        sb.append('*');
                        System.out.println(i + " letter words: " + counts[i]);
                        System.out.println(sb);
                        System.out.println(("mean lenght: ") + ((double) total / strings.length));


        }}}}}
4

1 に答える 1

1

ループが混在しているため、印刷するものが多すぎ、場合によっては間違ったタイミングで印刷されます。ループを分割する必要があります。

まず、長さごとにカウントのみを出力します。

for (int i = 1; i < counts.length; i++){    
   System.out.println(i + " letter words: " + counts[i]);
}

次に、平均長を出力します。

System.out.println(("mean length: ") + ((double) total / strings.length));

最後に、アスタリスクを出力します。

for (int i = 1; i < counts.length; i++){    
    StringBuilder sb = new StringBuilder(20);
    sb.append(i);
    sb.append(" letter words: ");
    for (int j = 1; j <= counts[i]; j++) {
        sb.append('*');               
    }
    System.out.println(sb);
}
于 2014-08-06T14:27:20.260 に答える