java小说人物分析_第1页
java小说人物分析_第2页
java小说人物分析_第3页
java小说人物分析_第4页
java小说人物分析_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一.实验题目

自行下载自己最喜欢的小说I部。存储为文本文档。要求长篇小说,20万字以上。

任取其中10个人物,考虑他们的姓名、别名等等一系列因素。

(1)统计每个人在小说中出现的次数并排序。

(2)统计每个人在小说中出现的篇幅跨度(第一次出现距最后一次出现的篇

幅)并排序。

(3)如果两人在相距较短的一段文字中出现,我们认为两人有关系,距离

越短,关系越近。自行设计统计标准,找出10个人中:

1)关系最紧密的两个人,关系最不紧密的两个人。

2)输入一个人名,列出该人和其他人关系的紧密程度排名。

看与实际是否符合?如果不太符合,说明可能的原因。

二.需求分析.

①本演示程序用eclipse编写,完成小说人物的出现次数统计,人物篇幅跨度统计以

及人物间亲密程度的统计。

统计人物出现次数:编写一个函数,当传入参数为人物名称时可统计该人物名

在小说中的出现次数。

②人物篇幅跨度:编写一个函数,当传入参数为人物名称是可统计该人物名

在小说中第一次出现的位置以及最后一次出现的位置,将最后一次出现位置减

去第一次出现的位置比去小说通篇长度可得该人物名在小说中的人物篇幅跨度。

③人物间亲密程度:编写一个函数,当传入参数为人物名一和人物名二时,

统计人物名一与人物名二同时在某个字数范围内出现的篇幅占人物名一的篇幅

之比就是人物名一与人物名二的亲密程度。

④制作功能选择界面;界面包含有十个人物名的下拉列表,二个功能排序按

钮,一个文本区域可输出统计结果。

三.概要设计

1)为了实现上述程序功能,需要定义一下几个类:

①Interface类:该程序的功能选择界面,包含main函数。

②Novelfunclion1类:用来实现程序的第一个功能的类。

③Novelfunction2类:用来实现程序的第二个功能的类。

®Novelfunction3类:用来实现程序的第三个功能的类。

⑤Saver类:用来保存程序运行后的统计结果,结果将统计在result.txt中。

在程序运行中,在界面中的下拉列表选定一位人物,选定后在界面的文本区

域中会输出该人物在小说中的出现次数,篇幅跨度以及与其他九个人物间的亲

密程度;在界面中点击功能按钮“人物出现次数排序”,点击后文本区域会输出

卜个人物在小说中出现次数的升序排序;在界面中点击功能按钮“人物篇幅跨度

排序”,点击后文本区域会输出十个人物在小说中篇幅跨度的升序排序;在界面

中点击功能按钮“人物关系密度排序”,点击后文本区域中会输出十个人物间亲

密程度最高的一组利亲密程度最低的一组结果。

四.源代码:

①Inierface:

packagenovelproject;

importjavax.swing.3Frame;

importjavax.swing.3Panel;

importjavax.swing.DComboBox;

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.3Button;

importjavax.swing.DTextArea;

importjava.io.BufferedReader;

importjava.io.FileOutputStream;

importjava.io.Fileinputstream;

importjava.io.File;

importjava.io.FileReader;

importjava.io.Printstream;

importjava.util.Arrays;

importjava.util.HashMap;

publicclassInterfaceextendsDFrameimplements

ItemListener,ActionListener{

privateDLabeljbl=new3Label("嫌疑犯X的献身“);

privateDLabelfunction=newJLabel("功能");

privateZIPaneljpl=newJPanel();

privateBorderLayoutbl=newBorderLayout(10,10);

privateDComboBoxjcb=new3ComboBox();

private3Buttonjbtl=newJButton("出现次数排序”);

privateJButtonjbt2=newJButton("篇幅跨度排序");

privateJButtonjbt3=newJButton("关系密度排序”);

privateJTextAreajta=newJTextArea("以下是结果:\n”,30,3。);

privatestaticStringpersonname=null;

privatestaticString[]arrl=new汤川”,“草雍”岸谷”,“问

宫”,”石神”,“靖子美里”J富坚“,”工藤”,“小代子”};

privatestaticint[]arr2=newint[10];

privatestaticHashMap<String,Integer>rls=new

HashMap<StringJInteger>();

privateFontfontl=newFont("黑体",Font.BOLD,20);

privateFontfont2=newFont("华文新魏'Font.BOLD,16);

privateFontfont3=newFont("黑体",Font.BOLD,14);

publicJPanelcreateWESTl(){

DPanelwestl=newJPanel();

westl.setLayoutfnewGridLayout(6,l,5,5));

westl.add(jcb);

"1?.3€1:11七001("请选择人物”);

jcb.additem(“汤川“);

jcb.addltem("草:雍");

jcb.additem(“岸谷”);

jcb.additem("间宫”);

jcb.additem("石神");

jcb.additem("靖了");

jcb.additem("美甲”);

"儿2€1加1:的(”富坚”);

jcb.additem(“工藤”);

jcb.additem("小代子");

westl.add(function);

westl.add(jbtl);

westl.add(jbt2);

westl.add(jbt3);

returnwestl;

}

public[PanelcreateWEST2(){

[Panelwest2=newJPanel();

west2.setLayout(newFlowLayout());

west2.add(createWESTl());

returnwest2;

}

public[PanelcreateNORTH(){

DPanelnorth=newJPanel();

north.setLayout(newFlowLayout(FlowLayouT.CENTER));

north.add(jbl);

returnnorth;

}

publicDPanelcreateCENTER(){

DPanelcenter=new3Panel();

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(fontl);

jbtl.setFont(font2);

jbt2.setFont(font2);

jbt3.setFont(font2);

jbl.setFont(fontl);

function.setFont(fontl);

this.setBackground(Color.yellow);

jcb.addltemListener(this);

jbtl.addActionListener(this);

jbt2.addActionListener(this);

jbt3.addActionListener(this);

this.setSize(500,600);

this.setVisible(true);

this.setDefaultCloseOperation(3Frame.EXIT_ON_CLOSE);

}

publicvoiditemStateChanged(ItemEvente){

if(e.getStateChange()==ItemEvent.SELECTED)(

switch((String)e.getltem()){

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="lB";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(Exceptionel){

el.printStackTraceO;

}

}

}

publicvoidactionPerformed(ActionEvente){

if(e.getSource()==jbtl){

inti;

HashMap<Integer,String>hm=newHashMap<IntegerJString>();

for(i=0;i<10;i++){

try(

byte[]data=NovelFunctionl.getData();

arr2[i]=NovelFunctionl.stat(data,arrl[i]);

hm.put(arr2[i],arrl[i]);

}catch(Exceptionel){

el.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];

HashMap<Float,String>hm=newHashMap<Float,String>();

for(i=0;i<10;i++){

try{

arr3[i]=NovelFunction2.Span(arrl[i]);

hm.put(arr3[i],arrl[i]);

}catch(Exceptionel){

el.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(arrl[i]);

for(Stringa:arrl){

if(arrl[i]!=a){

if(rls.get(a)==100){

jta.append(arrl[i]+"与"+a+"最亲密为:

"+rls.get(a)+"\n");

}

)

}

}catch(Exceptionel){

el.printStackTrace();

}

)

for(inti=0;i<10;i++){

try{

rls=NovelFunction3.Relationship2(arrl[i]);

for(Stringa:arrl){

if(arrl[i]!=a){

if(rls.get(a)==0){

jta.append(arrl[i]+■与"+a+"最不亲密为:

,,+rls.get(a)+,,\n");

}

)

}

}catch(Exceptionel){

el.printStackTrace();

}

}

}

else(

System.exit(0);

}

}

publicstaticvoidmain(String[]args)throwsException{

newInterface。;

}

}

②NovelFunctionl:

packagenovelproject;

importjava.io.File;

importjava.io.Fileinputstream;

publicclassNovelFunctionl{

publicstaticbyte[]getData()throwsException(〃读文件

Filenovel=newFile("嫌疑犯X的献身.txt");

Fileinputstreamfis=newFilelnputStream(novel);

byte[]data=newbyte[(int)novel.length()];

fis.read(data);

fis.close();

returndata;

}

publicstaticintstat(byte[]data,Stringpn)throws

Exception{〃统计次数

StringdataStr=newString(data);

inttime=0;

for(inti=0;i<dataStr.length()-pn,length()-l;i++){

Strings3=dataStr.substring(i,i+pn.length()).toString();

if(s3.equals(pn)){

time++;

)

}

returntime;

)

},

③NovelFunction2:

packagenovelproject;

importjava.util.HashMap;

publicclassNovelFunction2{

publicstaticfloatSpan(Stringpn)throwsException{

byte[]data=NovelFunctionl.getData();

HashMap<String,Znteger>hml=newHashMap<String,Integer>();

HashMap<String,Znteger>hm2=newHashMap<String,Integer>();

HashMap<String,Znteger>hm3=newHashMap<StringJInteger>();

StringdataStr=newString(data);

inttime=0;

for(inti=0;i<dataStr.length()-pn.length[)-1;i++){

Strings3=dataStr.substring(i,i+pn.length()).toString();

if(s3.equals(pn)){

time++;

if(time==l){

hml.put(pn,i);

}

hm2.put(pn,i);

)

}

hm3.put(pn,(hm2.get(pn)-hml.get(pn)));

floatspan=((hm3.get(pn)*10000)/dataStr.length());

return(span/100);

}

}

④NovelFunction3:

packagenovelproject;

importjava.util.HashMap;

publicclassNovelFunction3{

privatestaticfloat[]rs=newfloat[10];

privatestaticHashMap<StringJFloat>rts=new

HashMap<StringJFloat>();

privatestaticString[]arr=newString口{“汤川“,“草氏雀”,“岸谷”J间宫

石神“,“靖子二”美里富坚”,“工藤,'小代子

publicstaticfloatRelationship!(Stringpnl,Stringpn2)throws

Exception{

byte[]data=NovelFunctionl.getData();

StringdataStr=newString(data);

inttime=NovelFunctionl.stat(data,pnl);

intscore=0;

intlengthl=0;

intlength2-1000;

for(;(length2<dataStr.length());lengthl+=1000jlength2+=1000){

for(inti=lengthl;i<length2-pnl.length()-1;i++){

Stringsl=dataStr.substringCi,i+pnl.length()).toString();

for(int

j=lengthl;(si.equals(pnl))&&(j<length2-pn2.length()-l);j++){

String

s2=dataStr.substring。,j+pn2.length()).toString();

if(s2.equals(pn2)){

score++;break;

}

}

}

}

floatrs=((score*10000)/time);

returnrs/100;

}

publicstaticHashMap<String,Float>Relationship2(Stringpn)throws

Exception{

for(inti=0;i<10;i++){

rs[i]=ReLationshipl(pn,arr[i]);

rLs.put(arr[i]jrs[i]);

}

returnrts;

)

}

⑤Saver:

packagenovelproject;

importjava.io.FileOutputStream;

importjava.io.Printstream;

importjava.util.Arrays;

importjava.util.HashMap;

importjavax.swing.JOptionPane;

publicclassSaver{

publicstaticStringti/ne=null;

privatestaticStringsp=null;

privatestaticHashMap<StringJFloat>rts=new

HashMap<String,Float>();

privatestaticString[]arr=newString口{"汤川","草雍","岸谷间宫

二”石神“丁靖子、“美里富坚“,”工藤“,“小代子“};

publicstaticvoidsaver(Stringpersonname)throwsException{

try(

byte[]data=NovelFunctionl.geWata();

intti=NovelFunctionl.stat(data,personname);

ti/ne=String.vaLueOf(ti);

sp=String.valueO/(NovelFunction2.Span(personname));

rts=NovelFunction3./?e£ationship2(personname);

}catch(Exceptionex){

JOptionPane.shoMMessogeDiaLog(null,"操作异常”);

}

Printstreamps=newPrintStream(new

FileOutputStream("e:\\eclipseWlnyWresult.txt"));

Stringmsgl="人物:”;

ps.println(msgl+personname+"\n");

Stringmsg2="出现次数:”;

ps.println(msg2+ti/ne+"\n");

Stringmsg3="人物篇幅跨度为:”;

ps.println(msg3+sp+"%"+"\n");

Stringmsg4="人物关系密度:

ps.println(msg4);

HashMap<Float,String>hm=newHashMap<Float,String>();

float[]aa=newfloat[10];

for(inti=0;i<10;i++){

aa[i]=rts.get(arr[i]);

hm.put(aa[i],arr[i]);

}

Arrays.sort(aa);

for(floata:aa){

if(personname!=hm.get(a)){

ps・printin(personname+"与"+hm.get(a)+”的关系密度为"+a);

)

}

ps.close();

}

}

五.测试结果

程序运行时初界面:

选择人物(1):

选择人物(2):

出现次数林序出现次数:620

篇幅片友排匕

x余♦友排序人物篇幅跨度为:98.55%

人物关系密度:

靖子与间宫的关系密度为4.03

靖子与岸谷的关系密度为19.19

清子与小代子的关系密度为20.64

靖子与汤川的关系密度为33.06

靖子与工藤的关系密度为34.67

靖子与草筵的关系密度为42.25

靖子与美里的关系密度为48.38

靖子与富坚的关系密度为53.38

靖子与石神的关系密度为66.93

选择人物(3):

嫌疑犯X的献身

汤川(:SJlRf)▼以下是结果:

功能人物:汤川

出现次象播序出现次数:471

先幅内心神与二

奚东金度排序人物篇幅跨度为:87.03%

人物关系密度:

汤川与小代子的关系密度为0.42

汤川与间宫的关系密度为4.24

汤川与美里的关系密度为5.94

汤川与工藤的关系密度为8.49

汤川与岸谷的关系密度为13.16

汤川与富坚的关系密度为20.38

汤川与靖子的关系密度为56.47

汤川与石神的关系密度为83.86

汤川与草籁的关系密度为86.19

选择人物(4):

篇幅碍及林寿

关余屯度掷与人物篇幅纬度为:87.01%

人物关系密度:

草锥与小代子的关系密度为2.13

草雉与美里的关系密度为9.88

草雍与间宫的关系密度为11.04

草雉与工藤的关系密度为15.5

草辖与岸谷的关系密度为36.04

草雉与富坚的关系密度为36.82

草辖与靖子的关系密度为64.53

草雉与石神的关系密度为64.72

草雍与汤川的关系密度为70.93

选择人物(5):

选择人物(6):

选择人物(7):

篇幅张度棹序

吴东电灰排序人物篇幅跨度为:85.99%

人物关系密度:

岸谷与小代子的关系密度为1.23

岸谷与工藤的关系密度为19.75

岸谷与间宫的关系密度为27.16

岸谷与美里的关系密度为28.39

岸谷与富枭的关系密度为34.56

岸谷与汤川的关系密度为50.61

岸谷与石神的关系密度为53.0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论