0

这段代码的目标是创建一个程序,使用 java 的 main 方法来分析用户输入的一段文本。

他们通过将文本输入扫描仪然后由程序分析来做到这一点。分析是产生词频,平均长度,并以星号图表的形式打印出结果,单个“*”代表1个词。

例如“鸟可能会飞”应该输出这个结果:

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: 

有没有办法改变我的代码,以便输出在第一部分中看到的内容,而不是我在第二部分中看到的内容。

代码:

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

Your loops are mixed, so you are printing too many things, and sometimes at the wrong time. You should split your loops.

First you want to output only the counts by length :

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

Then you want to output the mean length :

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

Finally you want to output the asterisks :

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 回答