第一次就记录给java的第五次作业吧

时间:2022-05-16 16:36:07

内容:使用scanner类和正则表达式统计一篇英文中的单词,要求如下:
–一共出现了多少个单词
–有多少个互不相同的单词
–按单词出现频率大小输出单词
•考核知识点:面向对象+输入输出


当时我是很懵逼的啊,前面两个还好做,最后一个是什么鬼啊!!!!
后来经过别人提醒之后,觉得要用HashMap。

先理清一下基本思路。
1.建立一个类,装一切需要的东西和方法。
2.利用Scanner.useDelimeter(),使用正则表达式把非单词过滤掉(有‘的两个单词合并在一起视为一个单词),储存在一个字符串数组里,储存的同时进行计数,得到装有所有单词的字符串数组和总单词数。第一个任务就解决了。
3.第二个任务…………一开始思路错了,后来想到这个方法,尽管这个方法有点麻烦。
创立一个新的字符串数组,不重复地装所有的单词。从所有单词里拿一个,然后下一个和这个不重复的数组的所有字符串对比,如果不重复就加进去。记得同时进行计数。
这样我们就能得到一个去重复的字符串数组,和这个字符串数组的单词个数,这个个数就是第二个要求所要的东西。
4.第三个要求。先创建一个整数数组,和不重复的单词数组一一对应,装的是单词出现的次数。
至于怎么得到这个次数,用比较脑残的思路就是,让不重复数组的每个单词都和所有单词的成员一个个进行对比,有一样的就+1。

我一开始想到用HashMap,后来发现HashMap不能用基本数据类型!于是我又得转化成Integer的封装类,不仅如此,HashMap里面相同的Key只能对应一个Value,我去,这怎么办,根本用不了啊!

但是后来我想了想,不是傻吗,根本不用HashMap,本来不重复的单词数组和整数数组就是一一对应的关系啊!
意识到这一点之后就简单了。

下面是详细代码。

CalWords.java
package examples;
import java.util.*;

/**  * Created by Kazami Hatsuroku on 2017/6/5.  */ public class CalWords {
    Scanner sc;
    String[] str = new String[100];
    String[] noRedundant = new String[100];
    int[] occurrence = new int[100];

    int count=0, sameWordSum=0, notSameWordSum=0;

    CalWords(Scanner sc){
        this.sc = sc;
        sc.useDelimiter("[^a-zA-Z']+");
        while (sc.hasNext()) {
            str[count] = sc.next();
            count++;                        //count是单词总数
        }
        calSameWords();
        calOccurrence();
    }


    void calSameWords(){
        boolean flag=true;
        for (int i = 0; i < count; i++) {
            for (int j = 0; j < notSameWordSum; j++) {
                if (str[i].equalsIgnoreCase(noRedundant[j])){
                    flag=false;
                    sameWordSum++;
                }
            }
            if(flag){
                noRedundant[i-sameWordSum]=str[i];
                notSameWordSum++;                   //notSameWordSum就是不重复的单词的总数
            }
            flag=true;
        }
    }

    void calOccurrence(){
        for (int i = 0; i < notSameWordSum; i++) {
            for (int j = 0; j < count; j++) {
                if(noRedundant[i].equalsIgnoreCase(str[j])){
                    occurrence[i]++;
                }
            }
        }
    }



    void printByOrder(){
        boolean flag = true;
        int max = 0;
        for (int i = 0; i < notSameWordSum; i++) {
            if(occurrence[i] > max){
                max=occurrence[i];
            }
        }
        while(max > 0){
            for (int i = 0; i < notSameWordSum; i++) {
                if (flag){
                    System.out.printf("这是出现过%d次的单词:",max);
                    flag = false;
                }
                if (occurrence[i]==max){
                    System.out.print(noRedundant[i]+" ");
                }
            }
            System.out.println();
            max--;
            flag = true;
        }
    }

}


Etest.java
package examples;
import java.io.*;
import java.util.*;

/**  * Created by Kazami Hatsuroku on 2017/5/22.  */ public class Etest {
    public static void main(String[] args) {
        File file = new File("F:\\java\\IdeaProjects\\learning\\src\\examples","flower.txt");
        Scanner sc;
        CalWords calw;
        try{
            sc = new Scanner(file);
            calw = new CalWords(sc);
            sc.close();
            System.out.println("单词总数为"+calw.count);
            System.out.println("互不相同的单词个数有"+ calw.notSameWordSum+"");
            System.out.println();
            calw.printByOrder();
        }

        catch (FileNotFoundException ex){
            System.out.println(ex.toString());
        }
    }


}

flower.txt
Howdy!
It's me, Flowey.
Flowey the flower!
I owe you a huge thanks.
You really did a number on that old fool. Without you, I never could have gotten past him.
But now , with your help...
He's dead.
And I've got the human souls!

运行结果
第一次就记录给java的第五次作业吧