社会网络分析系统的设计和实现Java.docx
《社会网络分析系统的设计和实现Java.docx》由会员分享,可在线阅读,更多相关《社会网络分析系统的设计和实现Java.docx(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上社会网络分析系统的设计和实现专心-专注-专业目录一、 设计题目【实验题目】社会网络分析系统的设计和实现【问题描述】实现一个社会网络分析系统。【基本要求】系统功能主要包括:1) 对email数据进行预处理,利用数据结构课程中图中的理论,建立社会网络的邻接矩阵。2) 利用度的概念,找出社会网络中核心人物、活跃人物和边缘人物。3) 利用子图概念分析社会网络的结构,找出小团体和联系小团体的桥接人物。4) 能查找任何人的交往圈子。二、 需求分析1)运行环境(软、硬件环境)软件:MyEclipse Professional 2014硬件:能运行MyEclipse Professi
2、onal 2014的硬件平台如CPU:Intel酷睿i5;内存4G;操作系统Windows82)输入的形式和输入值的范围数据类型:文本(txt)范围:在txt文本的最大存储范围内3)输出的形式描述采用界面形式输出1 该社会网络中个人的收发邮件数量2 该社会网络中的核心人物、活跃人物、边缘人物3 该社会网络中的小团体、桥接人物4 该社会网络中单个人的交往圈子4)功能描述1. 对email数据进行预处理,利用数据结构课程中图中的理论,建立社会网络的邻接矩阵2. 利用度的概念,找出社会网络中核心人物、活跃人物和边缘人物3. 利用子图概念分析社会网络的结构,找出小团体和联系小团体的桥接人物4. 能查找
3、任何人的交往圈子5)测试数据三、 概要设计1)抽象数据类型定义描述public SeqList(int size)/数组构造函数public Edge(int start,int dest,int weight)/边构造函数public AdjMatrixGraph(int size)/建立邻接矩阵public AdjMatrixGraph(T vertices,Edge edges)/建立邻接矩阵public int vertexCount()/邻接矩阵中顶点的个数public T get(int i)/取出第i个顶点的内容public String toString()/输出邻接矩阵pub
4、lic int insertVertex(T x)/插入邻接矩阵的顶点public void insertEdge(Edge edge)/插入邻接矩阵的度public void insertEdge(int i,int j,int weight)/插入邻接矩阵的度public int outdegres()/邻接矩阵中每个对象的出度总和public int indegres()/邻接矩阵中每个对象的入度总和2)功能模块设计(如主程序模块设计)public String activeperson()/活跃人物public String mainperson()/核心人物public String
5、 marginalperson()/边缘人物public boolean isExist(String temp,String str,int t)/是否存在该人public String group_one(String vertices,String str)/个人的圈子public String Connecter()/桥接人public String group(String vertices,String str)/圈子public String teamgroup()/小团体public int team()/团体public boolean isConnection(int te
6、mp,int i,int j,int t)/是否与其他人有联系3)模块层次调用关系图四、 详细设计在程序内定义一个AdjMatrixGraph的类来实现程序的基本操作。定义import_email这个类来实现文本的读取。定义MainFrm来实现数据的输出。AdjMatrixGraph类:protected SeqList vertexlist;protected int adjmatrix;protected int visit;private final int MAX_WEIGHT=99999;*public String activeperson()/活跃人物int max=-1;int
7、 line=-1;for(int i=0;imax)max=this.outdegres()i;line=i;return (String)this.get(line);利用AdjMatrixGraph中的某个人的出度总和函数,来计算每个人的出度总和也就是某个人发出邮件的数量,找出其中发送邮件数量最大的人作为活跃人物。*public String mainperson()/核心人物int temp = new int this.outdegres().length;int max=-1;int line=-1;for(int i=0;ithis.outdegres().length;i+)te
8、mpi=this.outdegres()i+this.indegres()i;for(int i=0;imax)max=this.outdegres()i;line=i;return (String)this.get(line);利用AdjMatrixGraph中的某个人的出度和入度总和函数,来计算每个人的出度和入度总和也就是某个人发出和接收邮件的数量,找出其中发送和接收邮件数量最大的人作为活跃人物。*public String marginalperson()/边缘人物int temp = new int this.outdegres().length;int min=99999;int l
9、ine=-1;for(int i=0;ithis.outdegres().length;i+)tempi=this.outdegres()i+this.indegres()i;for(int i=0;itemp.length;i+)if(tempimin)min=tempi;line=i;return (String)this.get(line);利用AdjMatrixGraph中的某个人的出度和入度总和函数,来计算每个人的出度和入度总和也就是某个人发出和接收邮件的数量,找出其中发送和接收邮件数量最小的人作为活跃人物。*public boolean isExist(String temp,St
10、ring str,int t)/是否存在该人for(int i=0;it;i+)if(tempi.equals(str)return true;return false;在查找某人的圈子时候,判断此人是否已经有过此人。*public String group_one(String vertices,String str)/个人的圈子String init=this.group(vertices, str);int count=0;while(initcount!=null)count+;String temp=new Stringcount;for(int i=0;icount;i+)temp
11、i=initi;return temp;调用group()函数利用返回值的String类进行整理,截取前面的内容丢弃null。*public String Connecter()/桥接人int count=0;for(int i=0;i=2)count+;String connector = new Stringcount;count=0;for(int i=0;i=2)connectorcount=(String)this.get(i);count+;return connector;在访问小团体teamgroup()的时候,声明的visit数组来计算每个人访问的次数,在visit中的值大于
12、等于2的时候此人就处于两个团体之中,也就是作为桥接人。*public String group(String vertices,String str)/圈子String temp = new Stringvertices.length;int location=-1;int count=0;for(int i=0;ivertices.length;i+)if(verticesi.equals(str)location=i;break;for(int i=0;ivertices.length;i+)if(this.adjmatrixlocationi!=0 & this.adjmatrixloc
13、ationi!=MAX_WEIGHT)tempcount=(String)this.get(i);count+;for(int i=0;ivertices.length;i+)if(this.adjmatrixilocation!=0 & this.adjmatrixilocation!=MAX_WEIGHT)if(!this.isExist(temp, (String)this.get(i),count)tempcount=(String)this.get(i);count+;return temp;查找制定人在邻接矩阵中的i行j列的位置,记录位置。执行循环,第一次查找制定人所在行和列数值不
14、为0和99999的数,记录个数,建立特定的数组。第二次,再次循环把行和列数值不为0和99999的数的特定人赋值到数组中,返回数组。*public String teamgroup()/小团体int temp = this.team();int count=0;for(int i=0;itemp.length;i+)if(!(tempi0=0 | tempi1=0)count+;String group=new String counttemp.length/2;int t=count;count=0;for(int i=0;itemp.length & countt;i+)if(!(tempi
15、0=0 | tempi1=0)for(int j=0;tempij!=0;j+)groupcountj=(String)this.get(tempij-1);count+;return group;接收team()传回来的数组,进行处理,截断输出。*public int team()/团体visit = new intthis.vertexCount();int temp = new intthis.vertexCount()this.vertexCount();for(int i=0;ithis.vertexCount();i+)if(visiti=0)tempi0=i+1;visiti+;
16、int t=1;for(int j=0;jthis.vertexCount();j+)if(this.isConnection(temp, i, j, t)tempit=j+1;visitj+;t+;return temp;先指定一个对象,从这个对象开始,先从此对象发送过的邮件人中查找,当某一个对象拜访过后,其对应visit中的值加1,查找与这一个对象有联系的人,有联系的人为有过邮件上的往来的人,利用isConnection()的方法进行,如果此人定义为有联系的人,把这个人的坐标存入temp的数组中,再进行下一步的查找,查找到另一个时,要确定这个人是否与temp数组中的人都有过邮件上的往来,如
17、果都有就存入temp数组,没有就丢弃。这一对象查找完毕后,查找下一对象,在查找下一对象之前,先访问这一对象的visit数组中的值是否为0,只有当他没有访问过时,才能从这一对象开始查找。最后访问所有的对象,并返回数组。*public boolean isConnection(int temp,int i,int j,int t)/是否与其他人有联系int flag=0;for(int m=0;mt;m+)if(this.adjmatrixtempim-1j!=0 & this.adjmatrixtempim-1j!=MAX_WEIGHT & this.adjmatrixjtempim-1!=0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 社会 网络分析 系统 设计 实现 Java
限制150内