java小说人物分析.docx
- 文档编号:6929832
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:23
- 大小:898.26KB
java小说人物分析.docx
《java小说人物分析.docx》由会员分享,可在线阅读,更多相关《java小说人物分析.docx(23页珍藏版)》请在冰豆网上搜索。
java小说人物分析
一.实验题目
自行下载自己最喜欢的小说1部。
存储为文本文档。
要求长篇小说,20万字以上。
任取其中10个人物,考虑他们的姓名、别名等等一系列因素。
(1)统计每个人在小说中出现的次数并排序。
(2)统计每个人在小说中出现的篇幅跨度(第一次出现距最后一次出现的篇幅)并排序。
(3)如果两人在相距较短的一段文字中出现,我们认为两人有关系,距离越短,关系越近。
自行设计统计标准,找出10个人中:
1)关系最紧密的两个人,关系最不紧密的两个人。
2)输入一个人名,列出该人和其他人关系的紧密程度排名。
看与实际是否符合?
如果不太符合,说明可能的原因。
二.需求分析
本演示程序用eclipse编写,完成小说人物的出现次数统计,人物篇幅跨度统计以及人物间亲密程度的统计。
1统计人物出现次数:
编写一个函数,当传入参数为人物名称时可统计该人物名在小说中的出现次数。
②人物篇幅跨度:
编写一个函数,当传入参数为人物名称是可统计该人物名在小说中第一次出现的位置以及最后一次出现的位置,将最后一次出现位置减去第一次出现的位置比去小说通篇长度可得该人物名在小说中的人物篇幅跨度。
③人物间亲密程度:
编写一个函数,当传入参数为人物名一和人物名二时,统计人物名一与人物名二同时在某个字数范围内出现的篇幅占人物名一的篇幅之比就是人物名一与人物名二的亲密程度。
④制作功能选择界面:
界面包含有十个人物名的下拉列表,三个功能排序按钮,一个文本区域可输出统计结果。
三.概要设计
1)为了实现上述程序功能,需要定义一下几个类:
①Interface类:
该程序的功能选择界面,包含main函数。
②Novelfunction1类:
用来实现程序的第一个功能的类。
③Novelfunction2类:
用来实现程序的第二个功能的类。
④Novelfunction3类:
用来实现程序的第三个功能的类。
⑤Saver类:
用来保存程序运行后的统计结果,结果将统计在result.txt中。
在程序运行中,在界面中的下拉列表选定一位人物,选定后在界面的文本区域中会输出该人物在小说中的出现次数,篇幅跨度以及与其他九个人物间的亲密程度;在界面中点击功能按钮“人物出现次数排序”,点击后文本区域会输出十个人物在小说中出现次数的升序排序;在界面中点击功能按钮“人物篇幅跨度排序”,点击后文本区域会输出十个人物在小说中篇幅跨度的升序排序;在界面中点击功能按钮“人物关系密度排序”,点击后文本区域中会输出十个人物间亲密程度最高的一组和亲密程度最低的一组结果。
四.源代码:
①Interface:
package novelproject;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
import javax.swing.JComboBox;
importjavax.swing.JLabel;
import java.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;
import javax.swing.JTextArea;
importjava.io.BufferedReader;
importjava.io.FileOutputStream;
importjava.io.FileInputStream;
import java.io.File;
importjava.io.FileReader;
importjava.io.PrintStream;
importjava.util.Arrays;
importjava.util.HashMap;
public classInterfaceextendsJFrameimplementsItemListener,ActionListener{
ﻩprivateJLabeljbl=newJLabel("嫌疑犯X的献身");
privateJLabelfunction=new JLabel("功能");
privateJPaneljpl=new JPanel();
privateBorderLayout bl=newBorderLayout(10,10);
privateJComboBoxjcb=newJComboBox();
privateJButtonjbt1=new JButton("出现次数排序");
privateJButtonjbt2=newJButton("篇幅跨度排序");
ﻩprivateJButtonjbt3=newJButton("关系密度排序");
ﻩprivate JTextAreajta=newJTextArea("以下是结果:
\n",30,30);
privatestaticStringpersonname=null;
privatestaticString[]arr1=newString[]{"汤川","草薙","岸谷","间宫","石神","靖子","美里","富坚","工藤","小代子"};
privatestaticint[]arr2=newint[10];
privatestatic HashMap<String,Integer>rls=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);
ﻩreturn west1;
ﻩ}
publicJPanel createWEST2(){
ﻩJPanelwest2=newJPanel();
ﻩwest2.setLayout(new FlowLayout());
ﻩwest2.add(createWEST1());
ﻩreturnwest2;
}
ﻩpublic JPanel createNORTH(){
ﻩJPanelnorth=newJPanel();
ﻩnorth.setLayout(newFlowLayout(FlowLayout.CENTER));
ﻩnorth.add(jbl);
ﻩﻩreturnnorth;
ﻩ}
publicJPanelcreateCENTER(){
ﻩJPanel center=new JPanel();
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);
File file=newFile("result.txt");
ﻩFileReaderfr=new FileReader(file);
ﻩﻩﻩBufferedReader br=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();
ﻩﻩ}ﻩﻩ
ﻩﻩ}
}
public voidactionPerformed(ActionEvente){
ﻩif(e.getSource()==jbt1){
ﻩﻩinti;
ﻩ HashMap<Integer,String>hm=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(int a:
arr2){
ﻩﻩjta.append(hm.get(a)+"的出现次数:
"+a+"\n");
ﻩﻩ}
ﻩﻩ
ﻩﻩ}
ﻩﻩelse if(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(arr1[i]);
ﻩﻩhm.put(arr3[i],arr1[i]);
ﻩ}catch(Exceptione1){
ﻩe1.printStackTrace();
ﻩﻩﻩ}
ﻩﻩ}
ﻩArrays.sort(arr3);
ﻩﻩjta.setText("以下是结果:
\n");
ﻩfor(float a:
arr3){
ﻩﻩjta.append(hm.get(a)+"的篇幅跨度为:
"+a+"%"+"\n");
ﻩ}
}
ﻩﻩelseif(e.getSource()==jbt3){
jta.setText("以下是结果:
\n");
ﻩﻩfor(int i=0;i<10;i++){
ﻩﻩtry{
ﻩﻩﻩﻩrls=NovelFunction3.Relationship2(arr1[i]);
ﻩﻩfor(String a:
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(String a:
arr1){
ﻩﻩif(arr1[i]!
=a){
ﻩﻩﻩﻩﻩif(rls.get(a)==0){
ﻩﻩﻩﻩjta.append(arr1[i]+"与"+a+"最不亲密为:
"+rls.get(a)+"\n");
ﻩﻩ}
ﻩﻩ}
ﻩﻩﻩ}ﻩ
ﻩﻩﻩ}catch(Exception e1){
ﻩﻩﻩe1.printStackTrace();
ﻩ}ﻩ
ﻩﻩ}ﻩ
}
ﻩelse{
ﻩSystem.exit(0);
}
}
public staticvoidmain(String[]args) throwsException{
ﻩﻩnewInterface();
ﻩ}
}
2NovelFunction1:
packagenovelproject;
importjava.io.File;
importjava.io.FileInputStream;
public classNovelFunction1{
ﻩpublic staticbyte[] getData()throwsException{ //读文件
ﻩFile novel=newFile("嫌疑犯X的献身.txt");
ﻩFileInputStreamfis=newFileInputStream(novel);
ﻩbyte[] data=newbyte[(int)novel.length()];
fis.read(data);
ﻩfis.close();
ﻩreturn data;
}
ﻩpublicstaticintstat(byte[]data,Stringpn)throws Exception{ //统计次数
StringdataStr=newString(data);
int time=0;
for(int i=0;i ﻩﻩStrings3=dataStr.substring(i,i+pn.length()).toString(); ﻩﻩif(s3.equals(pn)){ ﻩﻩtime++; } } ﻩreturntime; } } 3NovelFunction2: packagenovelproject; importjava.util.HashMap; publicclassNovelFunction2{ publicstatic floatSpan(Stringpn)throwsException{ ﻩﻩbyte[] data=NovelFunction1.getData(); HashMap ﻩﻩHashMap<String,Integer>hm2=newHashMap ﻩHashMap 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==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; import java.util.HashMap; publicclassNovelFunction3{ privatestaticfloat[]rs=newfloat[10]; privatestatic HashMap ﻩprivate staticString[]arr=newString[]{"汤川","草薙","岸谷","间宫","石神","靖子","美里","富坚","工藤","小代子"}; ﻩpublicstaticfloatRelationship1(String pn1,Stringpn2)throwsException{ ﻩﻩbyte[]data=NovelFunction1.getData(); ﻩStringdataStr=newString(data); ﻩinttime=NovelFunction1.stat(data,pn1); ﻩintscore=0; ﻩﻩintlength1=0; ﻩﻩintlength2=1000; ﻩfor(;(length2<dataStr.length());length1+=1000,length2+=1000){ ﻩﻩfor(inti=length1;i<length2-pn1.length()-1;i++){ ﻩﻩStrings1=dataStr.substring(i,i+pn1.length()).toString(); ﻩﻩﻩfor(intj=length1;(s1.equals(pn1))&&(j<length2-pn2.length()-1);j++){ ﻩﻩﻩString s2=dataStr.substring(j,j+pn2.length()).toString(); ﻩﻩif(s2.equals(pn2)){ ﻩﻩﻩscore++;break; ﻩﻩ} ﻩﻩﻩﻩ} ﻩﻩﻩ} ﻩﻩ} ﻩfloat rs=((score*10000)/time); ﻩreturnrs/100; ﻩ} publicstaticHashMap for(int i=0;i<10;i++){ ﻩﻩrs[i]=Relationship1(pn,arr[i]); ﻩrls.put(arr[i],rs[i]); ﻩ} ﻩﻩreturnrls; ﻩ} } 5Saver: package novelproject; importjava.io.FileOutputStream; importjava.io.PrintStream; importjava.util.Arrays; import java.util.HashMap; importjavax.swing.JOptionPane; public class Saver{ publicstaticStrin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 小说 人物 分析