社會網(wǎng)絡(luò)分析系統(tǒng)的設(shè)計和實現(xiàn)Java_第1頁
社會網(wǎng)絡(luò)分析系統(tǒng)的設(shè)計和實現(xiàn)Java_第2頁
社會網(wǎng)絡(luò)分析系統(tǒng)的設(shè)計和實現(xiàn)Java_第3頁
社會網(wǎng)絡(luò)分析系統(tǒng)的設(shè)計和實現(xiàn)Java_第4頁
社會網(wǎng)絡(luò)分析系統(tǒng)的設(shè)計和實現(xiàn)Java_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

.. .. ..社會網(wǎng)絡(luò)分析系統(tǒng)的設(shè)計和實現(xiàn).專業(yè)資料... .. ..目錄一、 設(shè)計題目 1二、 需求分析 11)運行環(huán)境(軟、硬件環(huán)境) 12)輸入的形式和輸入值的范圍 23)輸出的形式描述 24)功能描述 25)測試數(shù)據(jù) 3三、 概要設(shè)計 41)抽象數(shù)據(jù)類型定義描述 42)功能模塊設(shè)計(如主程序模塊設(shè)計 ) 43)模塊層次調(diào)用關(guān)系圖 5四、 詳細設(shè)計 5五、 調(diào)試分析 161)問題和改進 162)時間&空間復(fù)雜度 17六、 測試結(jié)果 18.專業(yè)資料... .. ..七、 結(jié)論........................................................................................................................................21八、 附錄:程序設(shè)計源代碼 ...................................................................................................21.專業(yè)資料... .. ..一、設(shè)計題目【實驗題目】社會網(wǎng)絡(luò)分析系統(tǒng)的設(shè)計和實現(xiàn)【問題描述】實現(xiàn)一個社會網(wǎng)絡(luò)分析系統(tǒng) ?!净疽蟆肯到y(tǒng)功能主要包括:1)對email數(shù)據(jù)進行預(yù)處理,利用數(shù)據(jù)結(jié)構(gòu)課程中圖中的理論 ,建立社會網(wǎng)絡(luò)的鄰接矩陣。2)利用度的概念,找出社會網(wǎng)絡(luò)中核心人物 、活躍人物和邊緣人物。3)利用子圖概念分析社會網(wǎng)絡(luò)的結(jié)構(gòu) ,找出小團體和聯(lián)系小團體的橋接人物。4)能查找任何人的交往圈子 。二、需求分析1)運行環(huán)境(軟、硬件環(huán)境)軟件:MyEclipseProfessional2014硬件:能運行MyEclipseProfessional2014 的硬件平臺如CPU:Intel酷睿i5;內(nèi)存4G;操作系統(tǒng)Windows8.專業(yè)資料... .. ..2)輸入的形式和輸入值的范圍數(shù)據(jù)類型:文本(txt)范圍:在txt文本的最大存儲范圍內(nèi)3)輸出的形式描述采用界面形式輸出1. 該社會網(wǎng)絡(luò)中個人的收發(fā)郵件數(shù)量2. 該社會網(wǎng)絡(luò)中的核心人物 、活躍人物、邊緣人物3. 該社會網(wǎng)絡(luò)中的小團體、橋接人物4. 該社會網(wǎng)絡(luò)中單個人的交往圈子4)功能描述對email數(shù)據(jù)進行預(yù)處理,利用數(shù)據(jù)結(jié)構(gòu)課程中圖中的理論,建立社會網(wǎng)絡(luò)的鄰接矩陣利用度的概念,找出社會網(wǎng)絡(luò)中核心人物、活躍人物和邊緣人物利用子圖概念分析社會網(wǎng)絡(luò)的結(jié)構(gòu),找出小團體和聯(lián)系小團體的橋接人物能查找任何人的交往圈子.專業(yè)資料... .. ..5)測試數(shù)據(jù).專業(yè)資料... .. ..三、概要設(shè)計1)抽象數(shù)據(jù)類型定義描述publicSeqList(intsize){//數(shù)組構(gòu)造函數(shù)publicEdge(intstart,intdest,intweight){//邊構(gòu)造函數(shù)publicAdjMatrixGraph( intsize){//建立鄰接矩陣publicAdjMatrixGraph(T[]vertices,Edge[]edges){// 建立鄰接矩陣public intvertexCount(){// 鄰接矩陣中頂點的個數(shù)publicTget(inti){//取出第i個頂點的內(nèi)容publicStringtoString(){// 輸出鄰接矩陣public intinsertVertex(Tx){// 插入鄰接矩陣的頂點public voidinsertEdge(Edgeedge){// 插入鄰接矩陣的度public voidinsertEdge(inti,intj,intweight){//插入鄰接矩陣的度public int[]outdegres(){// 鄰接矩陣中每個對象的出度總和public int[]indegres(){// 鄰接矩陣中每個對象的入度總和2)功能模塊設(shè)計(如主程序模塊設(shè)計)publicStringactiveperson(){// 活躍人物publicStringmainperson(){// 核心人物publicStringmarginalperson(){// 邊緣人物public boolean isExist(String[]temp,Stringstr, intt){//是否存在該人.專業(yè)資料... .. ..publicString[]group_one(String[]vertices,Stringstr){//個人的圈子publicString[]Connecter(){//橋接人publicString[]group(String[]vertices,Stringstr){//圈子publicString[][]teamgroup(){//小團體publicint[][]team(){//團體publicbooleanisConnection(int[][]temp,inti,intj,intt){//是否與其他人有聯(lián)系3)模塊層次調(diào)用關(guān)系圖四、詳細設(shè)計在程序內(nèi)定義一個 AdjMatrixGraph 的類來實現(xiàn)程序的基本操作 。定義import_email 這個類來實現(xiàn)文本的讀取 。定義MainFrm來實現(xiàn)數(shù)據(jù)的輸出。.專業(yè)資料... .. ..AdjMatrixGraph 類:protected SeqList<T> vertexlist;protected int[][]adjmatrix;protected int[]visit;private final intMAX_WEIGHT=99999;*********************************************************************publicStringactiveperson(){// 活躍人物intmax=-1;intline=-1;for(inti=0;i<this.outdegres().length;i++){if(this.outdegres()[i]>max){max=this.outdegres()[i];line=i;}}return (String)this.get(line);}利用AdjMatrixGraph中的某個人的出度總和函數(shù) ,來計算每個人的出度總和也就是某個人發(fā)出郵件的數(shù)量 ,找出其中發(fā)送郵件數(shù)量最大的人作為活躍人物。*********************************************************************.專業(yè)資料... .. ..publicStringmainperson(){// 核心人物int[]temp= newint[this.outdegres().length];intmax=-1;intline=-1;for(inti=0;i<this.outdegres().length;i++)temp[i]=this.outdegres()[i]+this.indegres()[i];for(inti=0;i<temp.length;i++){if(temp[i]>max){max=this.outdegres()[i];line=i;}}return (String)this.get(line);}利用AdjMatrixGraph中的某個人的出度和入度總和函數(shù) ,來計算每個人的出度和入度總和也就是某個人發(fā)出和接收郵件的數(shù)量 ,找出其中發(fā)送和接收郵件數(shù)量最大的人作為活躍人物 。*********************************************************************publicStringmarginalperson(){// 邊緣人物int[]temp= newint[this.outdegres().length];intmin=99999;.專業(yè)資料... .. ..intline=-1;for(inti=0;i<this.outdegres().length;i++)temp[i]=this.outdegres()[i]+this.indegres()[i];for(inti=0;i<temp.length;i++){if(temp[i]<min){min=temp[i];line=i;}}return (String)this.get(line);}利用AdjMatrixGraph中的某個人的出度和入度總和函數(shù) ,來計算每個人的出度和入度總和也就是某個人發(fā)出和接收郵件的數(shù)量 ,找出其中發(fā)送和接收郵件數(shù)量最小的人作為活躍人物 。*********************************************************************public boolean isExist(String[]temp,Stringstr, intt){//是否存在該人for(inti=0;i<t;i++){if(temp[i].equals(str))return true;}return false;.專業(yè)資料... .. ..}在查找某人的圈子時候,判斷此人是否已經(jīng)有過此人 。*********************************************************************publicString[]group_one(String[]vertices,Stringstr){// 個人的圈子String[]init= this.group(vertices,str);intcount=0;while(init[count]!= null)count++;String[]temp= newString[count];for(inti=0;i<count;i++)temp[i]=init[i];return temp;}調(diào)用group()函數(shù)利用返回值的String[]類進行整理,截取前面的內(nèi)容丟棄null。*********************************************************************publicString[]Connecter(){// 橋接人intcount=0;for(inti=0;i<this.visit.length;i++){if(visit[i]>=2){count++;.專業(yè)資料... .. ..}}String[]connector= newString[count];count=0;for(inti=0;i<this.visit.length;i++){if(visit[i]>=2){connector[count]=(String) this.get(i);count++;}}return connector;}在訪問小團體teamgroup()的時候,聲明的visit[]數(shù)組來計算每個人訪問的次數(shù),在visit[]中的值大于等于2的時候此人就處于兩個團體之中 ,也就是作為橋接人。*********************************************************************publicString[]group(String[]vertices,Stringstr){// 圈子String[]temp= newString[vertices.length];intlocation=-1;intcount=0;for(inti=0;i<vertices.length;i++){.專業(yè)資料... .. ..if(vertices[i].equals(str)){location=i;break;}}for(inti=0;i<vertices.length;i++)if(this.adjmatrix[location][i]!=0&&this.adjmatrix[location][i]!= MAX_WEIGHT){temp[count]=(String) this.get(i);count++;}for(inti=0;i<vertices.length;i++)if(this.adjmatrix[i][location]!=0&&this.adjmatrix[i][location]!= MAX_WEIGHT){if(!this.isExist(temp,(String)this.get(i),count)){temp[count]=(String) this.get(i);count++;}}return temp;}查找制定人在鄰接矩陣中的 i行j列的位置,記錄位置。執(zhí)行循環(huán),第一次查.專業(yè)資料... .. ..找制定人所在行和列數(shù)值不為 0和99999的數(shù),記錄個數(shù),建立特定的數(shù)組。第二次,再次循環(huán)把行和列數(shù)值不為 0和99999的數(shù)的特定人賦值到數(shù)組中 ,返回數(shù)組。*********************************************************************publicString[][]teamgroup(){// 小團體int[][]temp= this.team();intcount=0;for(inti=0;i<temp.length;i++)if(!(temp[i][0]==0||temp[i][1]==0))count++;String[][]group= newString[count][temp. length/2];intt=count;count=0;for(inti=0;i<temp.length&&count<t;i++){if(!(temp[i][0]==0||temp[i][1]==0)){for(intj=0;temp[i][j]!=0;j++){group[count][j]=(String) this.get(temp[i][j]-1);}count++;}}return group;.專業(yè)資料... .. ..}接收team()傳回來的數(shù)組,進行處理,截斷輸出。*********************************************************************public int[][]team(){// 團體visit=newint[this.vertexCount()];int[][]temp= newint[this.vertexCount()][this.vertexCount()];for(inti=0;i<this.vertexCount();i++){if(visit[i]==0){temp[i][0]=i+1;visit[i]++;intt=1;for(intj=0;j<this.vertexCount();j++){if(this.isConnection(temp,i,j,t)){temp[i][t]=j+1;visit[j]++;t++;}}}}return temp;.專業(yè)資料... .. ..}先指定一個對象,從這個對象開始,先從此對象發(fā)送過的郵件人中查找 ,當(dāng)某一個對象拜訪過后,其對應(yīng)visit[]中的值加1,查找與這一個對象有聯(lián)系的人,有聯(lián)系的人為有過郵件上的往來的人 ,利用isConnection()的方法進行,如果此人定義為有聯(lián)系的人 ,把這個人的坐標(biāo)存入temp[][]的數(shù)組中,再進行下一步的查找,查找到另一個時,要確定這個人是否與temp[][]數(shù)組中的人都有過郵件上的往來,如果都有就存入temp[][]數(shù)組,沒有就丟棄。這一對象查找完畢后,查找下一對象,在查找下一對象之前,先訪問這一對象的visit[]數(shù)組中的值是否為0,只有當(dāng)他沒有訪問過時,才能從這一對象開始查找。最后訪問所有的對象,并返回數(shù)組。*********************************************************************public boolean isConnection(int[][]temp,inti,intj,intt){//是否與其他人有聯(lián)系intflag=0;for(intm=0;m<t;m++){if(this.adjmatrix[temp[i][m]-1][j]!=0&&this.adjmatrix[temp[i][m]-1][j]!= MAX_WEIGHT&&this.adjmatrix[j][temp[i][m]-1]!=0&&this.adjmatrix[j][temp[i][m]-1]!= MAX_WEIGHT){flag++;}.專業(yè)資料... .. ..}if(flag==t)return true;elsereturn false;}利用傳回來的temp[][]數(shù)組判斷聯(lián)系人與數(shù)組中的所有人是否兩兩存在郵件上的往來,返回boolean值。import_email 類:*********************************************************************publicEdge[]import_email_edges(){// 從文件中讀取出信息存入邊的數(shù)組publicString[]import_email_vertices(){// 從文件中讀取出信息存入頂點的數(shù)組public boolean isExists(String[]str,Stringword, intt){//判斷這個頂點是否存在public intvertices_where(String[]str,Stringword){// 查找這個值的頂點值在哪JFrame:*********************************************************************publicMainFrm(){//主界面.專業(yè)資料... .. ..publicGroupFrm(Stringstr){// 查找小團體界面publicSpecialPersonFrm(){// 查找特殊人界面publicTeamGroupFrm(){// 查找橋接人界面五、調(diào)試分析1)問題和改進【問題&改進1】小團體與橋接人的定義小團體:在小團體中,每個人都要與剩余的其他人進行兩兩的郵件收發(fā)。橋接:在兩個或者多個小團體中都出現(xiàn)的人物 ?!締栴}&改進2】橋接人的尋找如果是在查找完小團體之后 ,在從小團體之間找出共用的橋接人 ,就會對所有的小團體進行排序查找算法 ,這樣會影響算法的效率。所以我運用了visit[]數(shù)組,如果此對象經(jīng)過了拜訪 ,其對應(yīng)的值就加 1。最后,在查找橋接人的時候只要查找 visit[]數(shù)組中拜訪次數(shù)大于等于 2的情況就可以了,大大節(jié)省時間?!締栴}&改進3】Boolean值函數(shù)的使用在使用Boolean值函數(shù)進行判斷該成員是否在數(shù)組內(nèi)的時候一直出現(xiàn)空指針的問題 ,最后發(fā)現(xiàn)是數(shù)組中的值還沒有填滿的情況下使用數(shù)組.length 方法會發(fā)生空指針的問題 ,所以我在接下來的使用中 ,使用count 數(shù)值來統(tǒng)計已經(jīng)存放了多少數(shù)據(jù) ,并在函數(shù)調(diào)用的時候傳入.專業(yè)資料... .. ..count值作為循環(huán)結(jié)束條件。2)時間&空間復(fù)雜度1.時間復(fù)雜度publicint[]outdegres()--------O(n^2)publicint[]indegres()---------O(n^2)publicStringactiveperson()----O(n)publicStringmainperson()------O(n)publicStringmarginalperson()--O(n)publicbooleanisExist()--------O(n)publicString[]group_one()-----O(n)publicString[]Connecter()-----O(n)publicString[]group()---------O(n^2)publicString[][]teamgroup()---O(n)publicint[][]team()-----------O(n^3)publicbooleanisConnection()---O(n)2.空間復(fù)雜度public int[]outdegres()-------- O(n)public int[]indegres()--------- O(n)public Stringactiveperson()---- O(1).專業(yè)資料... .. ..publicStringmainperson()------O(1)publicStringmarginalperson()--O(1)publicbooleanisExist()--------O(1)publicString[]group_one()-----O(n)publicString[]Connecter()-----O(1)publicString[]group()---------O(n)publicString[][]teamgroup()---O(n)publicint[][]team()-----------O(n)publicbooleanisConnection()---O(1)六、測試結(jié)果.專業(yè)資料... .. ...專業(yè)資料... .. ...專業(yè)資料... .. ..七、結(jié)論在本次程序的編寫過程中 ,我先對題目進行分析,也對程序的要求進行分析,確定小團體、橋接人、活躍人物、核心人物、邊緣人物的定義。接著開始程序大體框架的搭建和所要運用的類進行定義 。我編寫程序中 ,有不清楚的地方就詢問老師來幫助我完成要求 ,對E-mail的處理操作和文件讀取操作是以前沒有學(xué)過的 ,所以我就上網(wǎng)找資料自主學(xué)習(xí)這個操作 ,并在程序中使用 。在程序編寫的時候我要先處理實驗測試數(shù)據(jù),在實驗測速數(shù)據(jù)的處理方面先畫出圖 ,然后再進行測試數(shù)據(jù)的編寫。我要接近真實的電子郵件環(huán)境 ,所以對測試數(shù)據(jù)的要求就大大增加了。在以后的編寫中多多使用 “斷點”進行編譯和執(zhí)行,可以大大提高編寫效率。這一次的課程設(shè)計中 ,我收獲了很多 ,希望在今后的編程中有所使用。八、附錄:程序設(shè)計源代碼package project;public classAdjMatrixGraph<T>{protected SeqList<T> vertexlist;protected int[][]adjmatrix;protected int[]visit;private final intMAX_WEIGHT=99999;.專業(yè)資料... .. ..public AdjMatrixGraph( intsize){size=size<10?10:size;this.vertexlist=newSeqList(size);this.adjmatrix=newint[size][size];for(inti=0;i<size;i++)for(intj=0;j<size;j++)this.adjmatrix[i][j]=(i==j)?0: MAX_WEIGHT;}public AdjMatrixGraph(T[]vertices,Edge[]edges){this(vertices.length);if(vertices==null)return;for(inti=0;i<vertices. length;i++)insertVertex(vertices[i]);if(edges!=null)for(intj=0;j<edges. length;j++)insertEdge(edges[j]);}public intvertexCount(){return this.vertexlist.length();}.專業(yè)資料... .. ..public intgetWeight( inti,intj){return this.adjmatrix[i][j];}public Tget(inti){return this.vertexlist.get(i);}public StringtoString(){Stringstr= "頂點集合:"+this.vertexlist.toString()+"\n 鄰接矩陣 \n ";intn=this.vertexCount();for(inti=0;i<n;i++){for(intj=0;j<n;j++)str+=this.adjmatrix[i][j]== MAX_WEIGHT?" ∞":"+this.adjmatrix[i][j];str+="\n" ;}return str;}public intinsertVertex(Tx){this.vertexlist.append(x);if(this.vertexCount()> this.adjmatrix.length){inttemp[][]= adjmatrix,i,j;.專業(yè)資料... .. ..this.adjmatrix=newint[temp.length*2][temp.length^2];for(i=0;i<temp. length;i++){for(j=0;j<temp. length;j++)this.adjmatrix[i][j]=temp[i][j];for(j=temp.length;j<temp.length*2;i++)this.adjmatrix[i][j]=MAX_WEIGHT;}for(i=temp.length;i<temp.length*2;i++)for(j=0;j<temp. length*2;j++)this.adjmatrix[i][j]=(i==j)?0: MAX_WEIGHT;}return this.vertexlist.length()-1;}public voidinsertEdge(Edgeedge){this.insertEdge(edge.start,edge.dest,edge.weight);}public voidinsertEdge(inti,intj,intweight){intn=this.vertexCount();if(i>=0&&i<n&&j>=0&&i!=j){if(this.adjmatrix[i][j]==MAX_WEIGHT)this.adjmatrix[i][j]=0;.專業(yè)資料... .. ..this.adjmatrix[i][j]+=weight;}}public int[]outdegres(){int[]temp= new int[this.adjmatrix.length];for(inti=0;i<this.adjmatrix.length;i++){for(intj=0;j<this.adjmatrix[0].length;j++){if(this.adjmatrix[i][j]!=MAX_WEIGHT)temp[i]=temp[i]+ this.adjmatrix[i][j];}}return temp;}public int[]indegres(){int[]temp= new int[this.adjmatrix.length];for(inti=0;i<this.adjmatrix[0].length;i++){for(intj=0;j<this.adjmatrix.length;j++){if(this.adjmatrix[j][i]!=MAX_WEIGHT)temp[i]=temp[i]+ this.adjmatrix[j][i];}}.專業(yè)資料... .. ..return temp;}public Stringactiveperson(){intmax=-1;intline=-1;for(inti=0;i<this.outdegres().length;i++){if(this.outdegres()[i]>max){max=this.outdegres()[i];line=i;}}return (String)this.get(line);}public Stringmainperson(){int[]temp= new int[this.outdegres().length];intmax=-1;intline=-1;for(inti=0;i<this.outdegres().length;i++)temp[i]= this.outdegres()[i]+ this.indegres()[i];for(inti=0;i<temp. length;i++){if(temp[i]>max){.專業(yè)資料... .. ..max=this.outdegres()[i];line=i;}}return (String)this.get(line);}public Stringmarginalperson(){int[]temp= new int[this.outdegres().length];intmin=99999;intline=-1;for(inti=0;i<this.outdegres().length;i++)temp[i]= this.outdegres()[i]+ this.indegres()[i];for(inti=0;i<temp. length;i++){if(temp[i]<min){min=temp[i];line=i;}}return (String)this.get(line);}public boolean isExist(String[]temp,Stringstr, intt){.專業(yè)資料... .. ..for(inti=0;i<t;i++){if(temp[i].equals(str))return true;}return false;}public String[]group_one(String[]vertices,Stringstr){String[]init= this.group(vertices,str);intcount=0;while(init[count]!= null)count++;String[]temp= newString[count];for(inti=0;i<count;i++)temp[i]=init[i];return temp;}public String[]Connecter(){intcount=0;for(inti=0;i<this.visit.length;i++){if(visit[i]>=2){count++;.專業(yè)資料... .. ..}}String[]connector= newString[count];count=0;for(inti=0;i<this.visit.length;i++){if(visit[i]>=2){connector[count]=(String) this.get(i);count++;}}return connector;}public String[]group(String[]vertices,Stringstr){String[]temp= newString[vertices. length];intlocation=-1;intcount=0;for(inti=0;i<vertices. length;i++){if(vertices[i].equals(str)){location=i;break;}}.專業(yè)資料... .. ..for(inti=0;i<vertices. length;i++)if(this.adjmatrix[location][i]!=0&&this.adjmatrix[location][i]!= MAX_WEIGHT){temp[count]=(String) this.get(i);count++;}for(inti=0;i<vertices. length;i++)if(this.adjmatrix[i][location]!=0&&this.adjmatrix[i][location]!= MAX_WEIGHT){if(!this.isExist(temp,(String) this.get(i),count)){temp[count]=(String) this.get(i);count++;}}return temp;}public String[][]teamgroup(){int[][]temp= this.team();intcount=0;for(inti=0;i<temp. length;i++)if(!(temp[i][0]==0||temp[i][1]==0)).專業(yè)資料... .. ..count++;String[][]group= newString[count][temp. length/2];intt=count;count=0;for(inti=0;i<temp. length&&count<t;i++){if(!(temp[i][0]==0||temp[i][1]==0)){for(intj=0;temp[i][j]!=0;j++){group[count][j]=(String) this.get(temp[i][j]-1);}count++;}}return group;}public int[][]team(){visit=newint[this.vertexCount()];int[][]temp= new int[this.vertexCount()][this.vertexCount()];for(inti=0;i<this.vertexCount();i++){if(visit[i]==0){temp[i][0]=i+1;visit[i]++;intt=1;.專業(yè)資料... .. ..for(intj=0;j<this.vertexCount();j++){if(this.isConnection(temp,i,j,t)){temp[i][t]=j+1;visit[j]++;t++;}}}}return temp;}public boolean isConnection( int[][]temp,inti,intj,intt){intflag=0;for(intm=0;m<t;m++){if(this.adjmatrix[temp[i][m]-1][j]!=0&&this.adjmatrix[temp[i][m]-1][j]!= MAX_WEIGHT&& this.adjmatrix[j][temp[i][m]-1]!=0&& this.adjmatrix[j][temp[i][m]-1]!= MAX_WEIGHT){flag++;}}if(flag==t).專業(yè)資料... .. ..return true;elsereturn false;}}package project;public classEdgeimplements Comparable<Edge>{public intstart,dest,weight;public Edge(intstart,intdest,intweight){this.start=start;this.dest=dest;this.weight=weight;}public StringtoString(){return "("+start+","+dest+","+weight+")";}public intcompareTo(Edgee){if(this.start!=e.start)return this.start-e.start;return this.dest-e.dest;}}.專業(yè)資料... .. ..package project;public classSeqList<T>{private Object[] element;private intlen;public SeqList(intsize){this.element=newObject[size];this.len=0;}public SeqList(SeqList<T>list){this(list.len);this.len=list.len;}public SeqList(){this(64);}public boolean isEmpty(){return this.len==0;}public intlength(){return this.len;}.專業(yè)資料... .. ..public Tget(inti){if(i>=0&&i< this.len)return (T)this.element[i];return null;}public voidset(inti,Tx){if(x==null)return;if(i>=0&&i< this.len)this.element[i]=x;elsethrow newIndexOutOfBoundsException(i+ "");}public StringtoString(){Stringstr= "(";if(this.len>0)str+= this.element[0].toString();for(inti=1;i<this.len;i++)str+=","+this.element[i].toString();return str+")";}.專業(yè)資料... .. ..public voidinsert(inti,Tx){if(x==null)return;if(this.len==element.length){Object[]temp= this.element;this.element=newObject[temp. length*2];for(intj=0;j<temp. length;i++)this.element[j]=temp[j];}if(i<0)i=0;if(i>this.len)i=this.len;for(intj=this.len-1;j>=i;j--)this.element[j+1]= this.element[j];this.element[i]=x;this.len++;}public voidappend(Tx){insert(this.len,x);}.專業(yè)資料... .. ..public Tremove(inti){if(this.len==0||i<0||i>= len)return null;Told=(T)this.element[i];for(intj=0;j<this.len-1;j++)this.element[j]= this.element[j+1];this.element[this.len-1]=null;this.len--;return old;}public voidremoveAll(){this.len=0;}}package project;import import public classimport_email{public Edge[]import_email_edges(){String[]vertices= this.import_email_vertices();String[][]temp= newString[999][2];.專業(yè)資料... .. ..Edge[]edges= null;intcount=0;try{Scannerscanner= newScanner(newFileInputStream("D:\\E-mail.txt" ));while(scanner.hasNext()){temp[count][0]=scanner.next();temp[count][1]=scanner.next();count++;}edges=newEdge[count];for(inti=0;i<count;i++)edges[i]=newEdge(vertices_where(vertices,temp[i][0]),vertices_where(vertices,temp[i][1]),1);}catch(IOExceptione){e.printStackTrace();}return edges;}public String[]import_email_vertices(){.專業(yè)資料... .. ..String[]temp= newString[999];String[]vertices= null;intcount=0;try{Scannerscanner= newScanner(newFileInputStream("D:\\E-mail.txt" ));while(scanner.hasNext()){Stringword=scanner.next();if(!this.isExists(temp,word,count)){temp[count]=word;count++;}}vertices=newString[count];for(inti=0;i<count;i++){vertices[i]=temp[i];}}catch(IOExceptione){e.printStackTrace();}.專業(yè)資料... .. ..return vertices;}public boolean isExists(String[]str,Stringword, intt){for(inti=0;i<t;i++){if(str[i].equals(word))return true;}return false;}public intvertices_where(String[]str,Stringword){for(inti=0;i<str. length;i++){if(str[i].equals(word))return i;}return -1;}public static voidmain(String[]args){import_emailemail= newimport_email();String[]vertices=email.import_email_vertices();for(inti=0;i<vertices. length;i++){System.out.println(vertices[i]);.專業(yè)資料... .. ..}Edge[]edges=email.import_email_edges();for(inti=0;i<edges. length;i++){System.out.println(edges[i]. start+""+edges[i].dest+""+edges[i].weight);}}}package project;import import import import public classMainFrm extends JFrameimplements ActionListener{private JTabletable=null;private String[] cols={ "編號","發(fā)件人","發(fā)件數(shù)量","收件數(shù)量"};private JButton Btn1=newJButton("查詢特殊人員");private JButton Btn2=newJButton("查詢單人圈子");private JButton Btn3=newJButton("查詢團體");private JButton Btn4=newJButton("橋接人");import_email email=newimport_email();.專業(yè)資料... .. ..String[] vertices=email.import_email_vertices();Edge[]edges=email.import_email_edges();AdjMatrixGraph<String> adjMatrixGraph =newAdjMatrixGraph<String>( vertices,edges);private voidinitTable(){String[][]rows= newString[adjMatrixGraph .vertexCount()][4];for(inti=0;i<adjMatrixGraph .vertexCount();i++){rows[i][0]=String. valueOf(i+1);rows[i][1]= vertices[i];rows[i][2]=String. valueOf(adjMatrixGraph .outdegres()[i]);rows[i][3]=String. valueOf(adjMatrixGraph .indegres()[i]);}table=newJTable(rows,cols);}public MainFrm(){JPaneljp=(JPanel) this.getContentPane();initTable();JScrollPanejsp_table= newJScrollPane(table);table.getColumnModel().getColumn(0).setPreferredWidth(1);jp.add(jsp_table);JPaneljp_top= newJPanel();.專業(yè)資料... .. ..jp_top.add(Btn1);jp_top.add(Btn2);jp_top.add(Btn3);jp_top.add(Btn4);jp.add(jp_top,BorderLayout.);NORTHBtn1.addActionListener(this);Btn2.addActionListener(this);Btn3.addActionListener(this);Btn4.addActionListener(this);this.setTitle("社交網(wǎng)絡(luò)分析系統(tǒng) ");this.setSize(500,400);this.setVisible(true);this.setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE);}public voidactionPerformed(ActionEvente){if(e.getSource()== Btn1){newSpecialPersonFrm();}if(e.getSource()== Btn2){introw=table.getSelectedRow();if(row>-1){.專業(yè)資料... .. ..Stringstr=String. valueOf(table.getValueAt(row,1));newGroupFrm(str);}elseJOptionPane.showMessageDialog(this,"請選擇一個成員!");}if(e.getSource()== Btn3){newTeamGroupFrm();}if(e.getSource()== Btn4){newConnectorFrm();}}public static voidmain(String[]args){newMainFrm();}}package project;import import import import public classConnectorFrm extends JFrameimplements ActionListener{.專業(yè)資料... .. ..import_email email=newimport_email();String[] vertices=email.import_email_vertices();Edge[]edges=email.import_email_edges();AdjMatrixGraph<String> adjMatrixGraph =newAdjMatrixGraph<String>( vertices,edges);JButtonbtn=newJButton("關(guān)閉窗口");JTextAreatxt=newJTextArea();public ConnectorFrm(){Stringtemp= null;adjMatrixGraph .teamgroup();for(inti=0;i<adjMatrixGraph .Connecter().length;i++){if(temp== null)temp= adjMatrixGraph .Connecter()[i];elsetemp=temp+ "\n" +adjMatrixGraph .Connecter()[i];}txt.setText(temp);JPaneljp=(JPanel) this.getContentPane();JPaneljp1= newJPanel();JPaneljp2= newJPanel();jp1.add(txt);jp2.add(btn);.專業(yè)資料... .. ..jp.add(jp1,BorderLayout. NORTH);jp.add(jp2,BorderLayout. SOUTH);btn.addActionListener( this);this.setSize(200,150);this.setVisible(true);this.setTitle("橋接人信息");}public voidactionPerformed(ActionEvente){if(e.getSource()== btn){dispose();}}public static voidmain(String[]args){newConnectorFrm();}}package project;import import import public classGroupFrm extends JFrameimplements ActionListener{.專業(yè)資料... .. ..import_email email=newimport_email();String[] vertices=email.import_email_vertices();Edge[]edges=email.import_email_edges();AdjMatrixGraph<String> adjMatrixGraph =newAdjMatrixGraph<String>( vertices,edges);JButtonbtn_add= newJButton("關(guān)閉窗口");JTextAreatxt=newJTextArea();public GroupFrm(Stringstr){Stringtemp= null;for(inti=0;i<adjMatrixGraph .group_one(vertices,str).length;i++){if(temp== null)temp= adjMatrixGraph .group_one(vertices,str)[i];elsetemp=temp+ "\n" +adjMatrixGraph .group_one(vertices,str)[i];}txt.setText(temp);JPaneljp=(JPanel) this.getContentPane();JPaneljp1= newJPanel();JPaneljp2= newJPanel();jp1.add(txt);jp2.add(btn_add);jp.add(jp1,BorderLayout. NORTH);.專業(yè)資料... .. ..jp.add(jp2,BorderLayout. SOUTH);btn_add.addActionListener( this);this.setSize(200,250);this.setVisible(true);this.setTitle("圈子信息");}public voidactionPerformed(ActionEvente){if(e.getSource()== btn_add){dispose();}}}package project;import import import public classSpecialPersonFrm extends JF

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論