java小说人物分析报告.docx
《java小说人物分析报告.docx》由会员分享,可在线阅读,更多相关《java小说人物分析报告.docx(26页珍藏版)》请在冰豆网上搜索。
java小说人物分析报告
一.实验题目
自行下载自己最喜欢的小说1部。
存储为文本文档。
要求长篇小说,20万字以上。
任取其中10个人物,考虑他们的姓名、别名等等一系列因素。
(1)统计每个人在小说中出现的次数并排序。
(2)统计每个人在小说中出现的篇幅跨度(第一次出现距最后一次出现的篇幅)并排序。
(3)如果两人在相距较短的一段文字中出现,我们认为两人有关系,距离越短,关系越近。
自行设计统计标准,找出10个人中:
1)关系最紧密的两个人,关系最不紧密的两个人。
2)输入一个人名,列出该人和其他人关系的紧密程度排名。
看与实际是否符合?
如果不太符合,说明可能的原因。
二.需求分析
本演示程序用eclipse编写,完成小说人物的出现次数统计,人物篇幅跨度统计以及人物间亲密程度的统计。
1统计人物出现次数:
编写一个函数,当传入参数为人物名称时可统计该人物名在小说中的出现次数。
②人物篇幅跨度:
编写一个函数,当传入参数为人物名称是可统计该人物名在小说中第一次出现的位置以及最后一次出现的位置,将最后一次出现位置减去第一次出现的位置比去小说通篇长度可得该人物名在小说中的人物篇幅跨度。
③人物间亲密程度:
编写一个函数,当传入参数为人物名一和人物名二时,统计人物名一与人物名二同时在某个字数范围内出现的篇幅占人物名一的篇幅之比就是人物名一与人物名二的亲密程度。
④制作功能选择界面:
界面包含有十个人物名的下拉列表,三个功能排序按钮,一个文本区域可输出统计结果。
三.概要设计
1)为了实现上述程序功能,需要定义一下几个类:
①Interface类:
该程序的功能选择界面,包含main函数。
②Novelfunction1类:
用来实现程序的第一个功能的类。
③Novelfunction2类:
用来实现程序的第二个功能的类。
④Novelfunction3类:
用来实现程序的第三个功能的类。
⑤Saver类:
用来保存程序运行后的统计结果,结果将统计在result.txt中。
在程序运行中,在界面中的下拉列表选定一位人物,选定后在界面的文本区域中会输出该人物在小说中的出现次数,篇幅跨度以及与其他九个人物间的亲密程度;在界面中点击功能按钮“人物出现次数排序”,点击后文本区域会输出十个人物在小说中出现次数的升序排序;在界面中点击功能按钮“人物篇幅跨度排序”,点击后文本区域会输出十个人物在小说中篇幅跨度的升序排序;在界面中点击功能按钮“人物关系密度排序”,点击后文本区域中会输出十个人物间亲密程度最高的一组和亲密程度最低的一组结果。
四.源代码:
①Interface:
packagenovelproject;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importjavax.swing.JComboBox;
importjavax.swing.JLabel;
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.GridLayout;
importjava.awt.FlowLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.ItemEvent;
importjava.awt.event.ItemListener;
importjavax.swing.JButton;
importjavax.swing.JTextArea;
importjava.io.BufferedReader;
importjava.io.FileOutputStream;
importjava.io.FileInputStream;
importjava.io.File;
importjava.io.FileReader;
importjava.io.PrintStream;
importjava.util.Arrays;
importjava.util.HashMap;
publicclassInterfaceextendsJFrameimplementsItemListener,ActionListener{
privateJLabeljbl=newJLabel("嫌疑犯X的献身");
privateJLabelfunction=newJLabel("功能");
privateJPaneljpl=newJPanel();
privateBorderLayoutbl=newBorderLayout(10,10);
privateJComboBoxjcb=newJComboBox();
privateJButtonjbt1=newJButton("出现次数排序");
privateJButtonjbt2=newJButton("篇幅跨度排序");
privateJButtonjbt3=newJButton("关系密度排序");
privateJTextAreajta=newJTextArea("以下是结果:
\n",30,30);
privatestaticStringpersonname=null;
privatestaticString[]arr1=newString[]{"汤川","草薙","岸谷","间宫","石神","靖子","美里","富坚","工藤","小代子"};
privatestaticint[]arr2=newint[10];
privatestaticHashMaprls=newHashMap();
privateFontfont1=newFont("黑体",Font.BOLD,20);
privateFontfont2=newFont("华文新魏",Font.BOLD,16);
privateFontfont3=newFont("黑体",Font.BOLD,14);
publicJPanelcreateWEST1(){
JPanelwest1=newJPanel();
west1.setLayout(newGridLayout(6,1,5,5));
west1.add(jcb);
jcb.addItem("请选择人物");
jcb.addItem("汤川");
jcb.addItem("草薙");
jcb.addItem("岸谷");
jcb.addItem("间宫");
jcb.addItem("石神");
jcb.addItem("靖子");
jcb.addItem("美里");
jcb.addItem("富坚");
jcb.addItem("工藤");
jcb.addItem("小代子");
west1.add(function);
west1.add(jbt1);
west1.add(jbt2);
west1.add(jbt3);
returnwest1;
}
publicJPanelcreateWEST2(){
JPanelwest2=newJPanel();
west2.setLayout(newFlowLayout());
west2.add(createWEST1());
returnwest2;
}
publicJPanelcreateNORTH(){
JPanelnorth=newJPanel();
north.setLayout(newFlowLayout(FlowLayout.CENTER));
north.add(jbl);
returnnorth;
}
publicJPanelcreateCENTER(){
JPanelcenter=newJPanel();
center.add(jta);
returncenter;
}
publicInterface(){
this.add(jpl);
jpl.setLayout(bl);
jpl.add(createWEST2(),BorderLayout.WEST);
jpl.add(createNORTH(),BorderLayout.NORTH);
jpl.add(createCENTER(),BorderLayout.CENTER);
jta.setFont(font1);
jbt1.setFont(font2);
jbt2.setFont(font2);
jbt3.setFont(font2);
jbl.setFont(font1);
function.setFont(font1);
this.setBackground(Color.yellow);
jcb.addItemListener(this);
jbt1.addActionListener(this);
jbt2.addActionListener(this);
jbt3.addActionListener(this);
this.setSize(500,600);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
publicvoiditemStateChanged(ItemEvente){
if(e.getStateChange()==ItemEvent.SELECTED){
switch((String)e.getItem()){
case"汤川":
personname="汤川";break;
case"草薙":
personname="草薙";break;
case"岸谷":
personname="岸谷";break;
case"间宫":
personname="间宫";break;
case"石神":
personname="石神";break;
case"靖子":
personname="靖子";break;
case"美里":
personname="美里";break;
case"富坚":
personname="富坚";break;
case"工藤":
personname="工藤";break;
case"小代子":
personname="小代子";break;
}
try{
Saver.saver(personname);
Filefile=newFile("result.txt");
FileReaderfr=newFileReader(file);
BufferedReaderbr=newBufferedReader(fr);
jta.setText("以下是结果;\n");
while(true){
Stringmsg=br.readLine();
if(msg==null){
break;
}
jta.append(msg+"\n");
}
fr.close();
br.close();
}catch(Exceptione1){
e1.printStackTrace();
}
}
}
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==jbt1){
inti;
HashMaphm=newHashMap();
for(i=0;i<10;i++){
try{
byte[]data=NovelFunction1.getData();
arr2[i]=NovelFunction1.stat(data,arr1[i]);
hm.put(arr2[i],arr1[i]);
}catch(Exceptione1){
e1.printStackTrace();
}
}
Arrays.sort(arr2);
jta.setText("以下是结果:
\n");
for(inta:
arr2){
jta.append(hm.get(a)+"的出现次数:
"+a+"\n");
}
}
elseif(e.getSource()==jbt2){
inti;
float[]arr3=newfloat[10];
HashMaphm=newHashMap();
for(i=0;i<10;i++){
try{
arr3[i]=NovelFunction2.Span(arr1[i]);
hm.put(arr3[i],arr1[i]);
}catch(Exceptione1){
e1.printStackTrace();
}
}
Arrays.sort(arr3);
jta.setText("以下是结果:
\n");
for(floata:
arr3){
jta.append(hm.get(a)+"的篇幅跨度为:
"+a+"%"+"\n");
}
}
elseif(e.getSource()==jbt3){
jta.setText("以下是结果:
\n");
for(inti=0;i<10;i++){
try{
rls=NovelFunction3.Relationship2(arr1[i]);
for(Stringa:
arr1){
if(arr1[i]!
=a){
if(rls.get(a)==100){
jta.append(arr1[i]+"与"+a+"最亲密为:
"+rls.get(a)+"\n");
}
}
}
}catch(Exceptione1){
e1.printStackTrace();
}
}
for(inti=0;i<10;i++){
try{
rls=NovelFunction3.Relationship2(arr1[i]);
for(Stringa:
arr1){
if(arr1[i]!
=a){
if(rls.get(a)==0){
jta.append(arr1[i]+"与"+a+"最不亲密为:
"+rls.get(a)+"\n");
}
}
}
}catch(Exceptione1){
e1.printStackTrace();
}
}
}
else{
System.exit(0);
}
}
publicstaticvoidmain(String[]args)throwsException{
newInterface();
}
}
2NovelFunction1:
packagenovelproject;
importjava.io.File;
importjava.io.FileInputStream;
publicclassNovelFunction1{
publicstaticbyte[]getData()throwsException{//读文件
Filenovel=newFile("嫌疑犯X的献身.txt");
FileInputStreamfis=newFileInputStream(novel);
byte[]data=newbyte[(int)novel.length()];
fis.read(data);
fis.close();
returndata;
}
publicstaticintstat(byte[]data,Stringpn)throwsException{//统计次数
StringdataStr=newString(data);
inttime=0;
for(inti=0;iStrings3=dataStr.substring(i,i+pn.length()).toString();
if(s3.equals(pn)){
time++;
}
}
returntime;
}
}
3NovelFunction2:
packagenovelproject;
importjava.util.HashMap;
publicclassNovelFunction2{
publicstaticfloatSpan(Stringpn)throwsException{
byte[]data=NovelFunction1.getData();
HashMaphm1=newHashMap();
HashMaphm2=newHashMap();
HashMaphm3=newHashMap();
StringdataStr=newString(data);
inttime=0;
for(inti=0;iStrings3=dataStr.substring(i,i+pn.length()).toString();
if(s3.equals(pn)){
time++;
if(time==1){
hm1.put(pn,i);
}
hm2.put(pn,i);
}
}
hm3.put(pn,(hm2.get(pn)-hm1.get(pn)));
floatspan=((hm3.get(pn)*10000)/dataStr.length());
return(span/100);
}
}
4NovelFunction3:
packagenovelproject;
importjava.util.HashMap;
publicclassNovelFunction3{
privatestaticfloat[]rs=newfloat[10];
privatestaticHashMaprls=newHashMap();
privatestaticString[]arr=newString[]{"汤川","草薙","岸谷","间宫","石神","靖子","美里","富坚","工藤","小代子"};
publicstaticfloatRelationship1(Stringpn1,Stringpn2)throwsException{
byte[]data=NovelFunction1.getData();
StringdataStr=newString(data);
inttime=NovelFunction1.stat(data,pn1);
intscore=0;
intlength1=0;
intlength2=1000;
for(;(length2for(inti=length1;iStrings1=dataStr.substring(i,i+pn1.length()).toString();
for(intj=length1;(s1.equals(pn1))&&(jStrings2=dataStr.substring(j,j+pn2.length()).toString();
if(s2.equals(pn2)){
score++;break;
}
}
}
}
floatrs=((score*10000)/time);
returnrs/100;
}
publicstaticHashMapRelationship2(Stringpn)throwsException{
for(inti=0;i<10;i++){
rs[i]=Relationship1(pn,arr[i]);
rls.put(arr[i],rs[i]);
}
returnrls;
}
}
5Saver:
packagenovelproject;
importjava.io.FileOutputStream;
importjava.io.PrintStream;
importjava.util.Arrays;
importjava.util.HashMap;
importjavax.swing.JOptionPane;
publicclassSaver{
publicstaticStringtime=null;
privatestat