哈利波特英文单词统计频率

package 课堂测试1;

public class wordArray {
private int num;
private String word;
public int getNum() {
	return num;
}
public void setNum(int num) {
	this.num = num;
}
public String getWord() {
	return word;
}
public void setWord(String word) {
	this.word = word;
}


};
package 课堂测试1;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;

import java.util.Map;
import java.util.TreeMap;

public class Words {

	public static void main(String[] args) throws Exception {
		// TODO 自动生成的方法存根
		 /*ArrayList<String> wordRecord = new ArrayList<String>();
		 ArrayList<Integer> wordNum=new ArrayList<Integer>();*/
		BufferedReader br=new BufferedReader(new FileReader("E:\\student.txt"));
		StringBuffer sb=new StringBuffer();
		 String text=null;
		/*while((text=br.read())!=-1) {
			char c=(char)text;
			if(c==' '||c=='\n') {
			}
		}*/
		 while((text=br.readLine())!=null) {
			 sb.append(text);
		 }
		 br.close();
		 String str=sb.toString();
		 String words[]=str.split("[^(a-zA-z)]+");
		 wordArray wa[]=new wordArray[words.length];
		 //Map<String,Integer>map=new TreeMap<String,Integer>();
		 
			 /*Integer num=m.get(a);
			 m.put(a,(num==null)?1:num+1);*/
		 int num=0;
		for(int i=0;i<words.length;i++) {
			int k=0;
			if(words[i]!=null) {
				for(int j=i;j<words.length;j++) {
					if(words[i].equals(words[j])) {
						wa[num].setWord(words[i]);
						wa[num].setNum(++k);
						
						words[j]=null;}
				}
						num++;	
					}	
				}
		for(int i=0;i<10;i++) {
			System.out.println(wa[i].getWord()+wa[i].getNum());
		}
			}
		
	};

  

package 课堂测试1;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.*;
public class test2 {
    public static void main(String [] args) throws Exception {

        BufferedReader br = new BufferedReader(new FileReader("E:\\student.txt"));
/*FileReader用缓冲区读取文本文件。通过查源码得知方法三内部实现时是使用数组形式来缓冲字符数据的
      BufferedReader提供了按行读取文本文件的方法readLine();readLine()返回行有效数据,不包含换行符,未读取到数据返回null
      https://blog.csdn.net/sutaotao_s77/article/details/79251364 */
        StringBuffer sb = new StringBuffer();
        /*当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。 
        和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象*/
        String text =null;
        while ((text=br.readLine())!= null){
            sb.append(text);// 将读取出的字符追加到stringbuffer中
        }
        br.close();  // 关闭读入流
        String str = sb.toString(); // 将stringBuffer转为字符即返回此序列中数据的字符串表示形式
        String[] words = str.split("[^(a-zA-Z)]+");  // 非单词的字符来分割,得到所有单词split 方法
        //将一个字符串分割为子字符串,然后将结果作为字符串数组返回。 [^abc] 任何字符,除了 a、b 或 c(否定) [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
        //String[] words = str.split(" ");
        Map<String ,Integer> map = new HashMap<String, Integer>() ;

        for(String word :words){
            if(map.get(word)==null){  // 若不存在说明是第一次,则加入到map,出现次数为1
                map.put(word,1);
            }else{
                map.put(word,map.get(word)+1);  // 若存在,次数累加1
            }
        }

        // 排序
        List<Map.Entry<String ,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
//在java中,如果要对集合对象或数组对象进行排序,需要实现Comparator接口以达到我们想要的目标
        Comparator<Map.Entry<String,Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {
            public int compare(Map.Entry<String, Integer> left, Map.Entry<String, Integer> right) {
                return (left.getValue().compareTo(right.getValue()));
            }
        };
        // 集合默认升序升序
        Collections.sort(list,comparator);

        for(int i=0;i<10;i++){// 由高到低输出
            System.out.println(list.get(list.size()-i-1).getKey() +":"+list.get(list.size()-i-1).getValue());
        }
    }
}

第一篇代码始终调不对,还差对单词的排序以及统计出现的频率没有完成,第二篇代码是从网上改编过来的,运行是成功了,但是由于我对Java的认知还不深,以至于后面关于排序那部分代码搞不清,我弄明白的地方均已做了详细注释。
通过这次测试感触挺深的,最大的收获就是我彻底学会了文件的读写操作。问题不少,我不会怎么把这个复杂问题模块化,不知道该怎样去分化这个程序又该如何贯连。比如这篇代码我不知道怎样把那些相同的单词挑出来并同时计算个数。用什么方法,新建类还是ArrayList或者二维数组,又该怎么用,我做题时思路很混乱,几乎不知该如何下手。
我觉得自己以后需要加强练习,并且学会逐渐地积累阅读各种类型难度代码,形成自己的一套代码库,这样才能对以后遇到的各种问题不至于手足无措。最后想说的就是代码中的问题我会逐渐改正并完善的。





转载于:https://www.cnblogs.com/zzstdruan1707-4/p/9775817.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我们可以了解到《哈利波特》是一部关于哈利、赫敏、罗恩等人在大法师邓布利多的帮助下,使用魔法抵抗伏地魔的故事。同时,根据引用和引用,我们可以使用Python对小说中的人物名字和出现频率进行统计和分析。 以下是Python代码示例: 1. 统计人物名字TOP20的词语 ```python import jieba import pandas as pd from collections import Counter from pyecharts import Bar # 读取小说文本 with open('harry_potter.txt', 'r', encoding='utf-8') as f: text = f.read() # 使用jieba分词 words = jieba.lcut(text) # 统计人物名字出现的次数 names = ['哈利', '赫敏', '罗恩', '邓布利多', '马尔福', '斯内普', '小天狼星'] names_count = Counter([word for word in words if word in names]) # 绘制柱状图 bar = Bar('主要人物Top20', background_color='white', title_pos='center', title_text_size=20) x = names_count.most_common(20) bar.add('', [i[0] for i in x], [i[1] for i in x], xaxis_interval=0, xaxis_rotate=30, is_label_show=True) bar.render() ``` 2. 统计整部小说出现最多的词语TOP15 ```python import jieba import pandas as pd from collections import Counter # 读取小说文本 with open('harry_potter.txt', 'r', encoding='utf-8') as f: text = f.read() # 使用jieba分词 words = jieba.lcut(text) # 统计词语出现的次数 words_count = Counter(words) # 去除停用词 stopwords = pd.read_csv('stopwords.txt', index_col=False, quoting=3, sep='\t', names=['stopword'], encoding='utf-8') words = [word for word in words if word not in stopwords] # 统计出现最多的词语TOP15 top15 = words_count.most_common(15) print(top15) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值