资源描述
一.实验题目
自行下载自己最喜欢的小说1部。存储为文本文档。要求长篇小说,20万字以上。
任取其中10个人物,考虑他们的姓名、别名等等一系列因素。
(1)统计每个人在小说中出现的次数并排序。
(2)统计每个人在小说中出现的篇幅跨度(第一次出现距最后一次出现的篇幅)并排序。
(3) 如果两人在相距较短的一段文字中出现,我们认为两人有关系,距离越短,关系越近。自行设计统计标准,找出10个人中:
1)关系最紧密的两个人,关系最不紧密的两个人。
2)输入一个人名,列出该人和其他人关系的紧密程度排名。
看与实际是否符合?如果不太符合,说明可能的原因。
二.需求分析
本演示程序用 eclipse 编写,完成小说人物的出现次数统计,人物篇幅跨度统计以及人物间亲密程度的统计。
① 统计人物出现次数:编写一个函数,当传入参数为人物名称时可统计该人物名在小说中的出现次数。
② 人物篇幅跨度:编写一个函数,当传入参数为人物名称是可统计该人物名在小说中第一次出现的位置以及最后一次出现的位置,将最后一次出现位置减去第一次出现的位置比去小说通篇长度可得该人物名在小说中的人物篇幅跨度。
③人物间亲密程度:编写一个函数,当传入参数为人物名一和人物名二时,统计人物名一与人物名二同时在某个字数范围内出现的篇幅占人物名一的篇幅之比就是人物名一与人物名二的亲密程度。
④制作功能选择界面:界面包含有十个人物名的下拉列表,三个功能排序按钮,一个文本区域可输出统计结果。
三.概要设计
1)为了实现上述程序功能,需要定义一下几个类:
①Interface类:该程序的功能选择界面,包含main函数。
②Novelfunction1类:用来实现程序的第一个功能的类。
③Novelfunction2类:用来实现程序的第二个功能的类。
④Novelfunction3类:用来实现程序的第三个功能的类。
⑤Saver类:用来保存程序运行后的统计结果,结果将统计在result.txt中。
在程序运行中,在界面中的下拉列表选定一位人物,选定后在界面的文本区域中会输出该人物在小说中的出现次数,篇幅跨度以及与其他九个人物间的亲密程度;在界面中点击功能按钮“人物出现次数排序”,点击后文本区域会输出十个人物在小说中出现次数的升序排序;在界面中点击功能按钮“人物篇幅跨度排序”,点击后文本区域会输出十个人物在小说中篇幅跨度的升序排序;在界面中点击功能按钮“人物关系密度排序”,点击后文本区域中会输出十个人物间亲密程度最高的一组和亲密程度最低的一组结果。
四.源代码:
①Interface:
package novelproject;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JButton;
import javax.swing.JTextArea;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.File;
import java.io.FileReader;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.HashMap;
public class Interface extends JFrame implements ItemListener,ActionListener{
private JLabel jbl=new JLabel("嫌疑犯X的献身");
private JLabel function=new JLabel("功能");
private JPanel jpl=new JPanel();
private BorderLayout bl=new BorderLayout(10,10);
private JComboBox jcb=new JComboBox();
private JButton jbt1=new JButton("出现次数排序");
private JButton jbt2=new JButton("篇幅跨度排序");
private JButton jbt3=new JButton("关系密度排序");
private JTextArea jta=new JTextArea("以下是结果:\n",30,30);
private static String personname=null;
private static String[] arr1=new String[]{"汤川","草薙","岸谷","间宫","石神","靖子","美里","富坚","工藤","小代子"};
private static int[] arr2=new int[10];
private static HashMap<String,Integer> rls=new HashMap<String,Integer>();
private Font font1=new Font("黑体",Font.BOLD,20);
private Font font2=new Font("华文新魏",Font.BOLD,16);
private Font font3=new Font("黑体",Font.BOLD,14);
public JPanel createWEST1() {
JPanel west1=new JPanel();
west1.setLayout(new GridLayout(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;
}
public JPanel createWEST2(){
JPanel west2=new JPanel();
west2.setLayout(new FlowLayout());
west2.add(createWEST1());
return west2;
}
public JPanel createNORTH(){
JPanel north=new JPanel();
north.setLayout(new FlowLayout(FlowLayout.CENTER));
north.add(jbl);
return north;
}
public JPanel createCENTER(){
JPanel center=new JPanel();
center.add(jta);
return center;
}
public Interface() {
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);
}
public void itemStateChanged(ItemEvent e){
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=new File("result.txt");
FileReader fr=new FileReader(file);
BufferedReader br=new BufferedReader(fr);
jta.setText("以下是结果;\n");
while(true){
String msg=br.readLine();
if(msg==null) {
break;
}
jta.append(msg+"\n");
}
fr.close();
br.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==jbt1){
int i;
HashMap<Integer,String> hm=new HashMap<Integer,String>();
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 (Exception e1) {
e1.printStackTrace();
}
}
Arrays.sort(arr2);
jta.setText("以下是结果:\n");
for(int a:arr2){
jta.append(hm.get(a)+" 的出现次数:"+a+"\n");
}
}
else if(e.getSource()==jbt2){
int i;
float[] arr3=new float[10];
HashMap<Float,String> hm=new HashMap<Float,String>();
for(i=0;i<10;i++){
try {
arr3[i]=NovelFunction2.Span(arr1[i]);
hm.put(arr3[i],arr1[i]);
}catch (Exception e1) {
e1.printStackTrace();
}
}
Arrays.sort(arr3);
jta.setText("以下是结果:\n");
for(float a:arr3){
jta.append(hm.get(a)+" 的篇幅跨度为:"+a+"%"+"\n");
}
}
else if(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 (Exception e1) {
e1.printStackTrace();
}
}
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)==0){
jta.append(arr1[i]+"与"+a+"最不亲密为:"+rls.get(a)+"\n");
}
}
}
}catch (Exception e1) {
e1.printStackTrace();
}
}
}
else{
System.exit(0);
}
}
public static void main(String[] args) throws Exception{
new Interface();
}
}
② NovelFunction1:
package novelproject;
import java.io.File;
import java.io.FileInputStream;
public class NovelFunction1 {
public static byte[] getData()throws Exception{ //读文件
File novel=new File("嫌疑犯X的献身.txt");
FileInputStream fis=new FileInputStream(novel);
byte[] data=new byte[(int)novel.length()];
fis.read(data);
fis.close();
return data;
}
public static int stat(byte[] data,String pn)throws Exception{ //统计次数
String dataStr=new String(data);
int time=0;
for(int i=0;i<dataStr.length()-pn.length()-1;i++){
String s3 =dataStr.substring(i,i+pn.length()).toString();
if(s3.equals(pn)){
time++;
}
}
return time;
}
}
③ NovelFunction2:
package novelproject;
import java.util.HashMap;
public class NovelFunction2 {
public static float Span(String pn)throws Exception{
byte[] data=NovelFunction1.getData();
HashMap<String,Integer> hm1=new HashMap<String,Integer>();
HashMap<String,Integer> hm2=new HashMap<String,Integer>();
HashMap<String,Integer> hm3=new HashMap<String,Integer>();
String dataStr=new String(data);
int time=0;
for(int i=0;i<dataStr.length()-pn.length()-1;i++){
String s3 =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)));
float span=((hm3.get(pn)*10000)/dataStr.length());
return (span/100);
}
}
④ NovelFunction3:
package novelproject;
import java.util.HashMap;
public class NovelFunction3 {
private static float[] rs=new float[10];
private static HashMap<String,Float> rls=new HashMap<String,Float>();
private static String[] arr=new String[]{"汤川","草薙","岸谷","间宫","石神","靖子","美里","富坚","工藤","小代子"};
public static float Relationship1(String pn1,String pn2)throws Exception{
byte[] data=NovelFunction1.getData();
String dataStr=new String(data);
int time=NovelFunction1.stat(data,pn1);
int score=0;
int length1=0;
int length2=1000;
for(;(length2<dataStr.length());length1+=1000,length2+=1000){
for(int i=length1;i<length2-pn1.length()-1;i++){
String s1=dataStr.substring(i,i+pn1.length()).toString();
for(int j=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);
return rs/100;
}
public static HashMap<String,Float> Relationship2(String pn)throws Exception{
for(int i=0;i<10;i++){
rs[i]=Relationship1(pn,arr[i]);
rls.put(arr[i],rs[i]);
}
return rls;
}
}
⑤ Saver:
package novelproject;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.HashMap;
import javax.swing.JOptionPane;
public class Saver {
public static String time=null;
private static String sp=null;
private static HashMap<String,Float> rls=new HashMap<String,Float>();
private static String[] arr=new String[]{"汤川","草薙","岸谷","间宫","石神","靖子","美里","富坚","工藤","小代子"};
public static void saver(String personname)throws Exception{
try{
byte[] data=NovelFunction1.getData();
int ti=NovelFunction1.stat(data,personname);
time=String.valueOf(ti);
sp=String.valueOf(NovelFunction2.Span(personname));
rls=NovelFunction3.Relationship2(personname);
}catch(Exception ex){
JOptionPane.showMessageDialog(null, "操作异常");
}
PrintStream ps=new PrintStream(new FileOutputStream("e:\\eclipse\\lny\\result.txt"));
String msg1="人物:";
ps.println(msg1+personname+"\n");
String msg2="出现次数:";
ps.println(msg2+time+"\n");
String msg3="人物篇幅跨度为:";
ps.println(msg3+sp+"%"+"\n");
String msg4="人物关系密度:";
ps.println(msg4);
HashMap<Float,String> hm=new HashMap<Float,String>();
float[] aa=new float[10];
for(int i=0;i<10;i++){
aa[i]=rls.get(arr[i]);
hm.put(aa[i], arr[i]);
}
Arrays.sort(aa);
for(float a:aa){
if(personname!=hm.get(a)){
ps.println(personname+"与"+hm.get(a)+"的关系密度为"+a);
}
}
ps.close();
}
}
五.测试结果
程序运行时初界面:
选择人物(1):
选择人物(2):
选择人物(3):
选择人物(4):
选择人物(5):
选择人物(6):
选择人物(7):
选择人物(8):
选择人物(9):
选择人物(10):
出现次数排序:
篇幅跨度排序:
关系亲密排序:
展开阅读全文