1、實驗目的java
1.理解不一樣體系結構風格的具體內涵。學習
2.學習體系結構風格的具體實踐。this
2、實驗環境spa
硬件: (依據具體狀況填寫)code
軟件:Java或任何一種本身熟悉的語言對象
3、實驗內容blog
「上下文關鍵字」KWIC(Key Word in Context,文本中的關鍵字)檢索系統接受有序的行集合:每一行是單詞的有序集合;每個單詞又是字母的有序集合。經過重複地刪除航中第一個單詞,並把它插入行尾,每一行能夠被「循環地移動」。KWIC檢索系統以字母表的順序輸出一個全部行循環移動的列表。排序
嘗試用不一樣的策略實現這個系統。選擇2-3種體系結構風格來實現。get
4、實驗步驟:input
KWIC 的主/子程序體系結構風格示意圖以下所示:
KWIC 主程序/子程序風格的 Java 語言實現:
1 public static void alphabetize(){ 2 String[] tmpArray = new String[shiftedLineIndexes.size()]; 3 shiftedLineIndexes.toArray(tmpArray); Arrays.sort(tmpArray); sortedLineIndexes=tmpArray; 4 } 5 public static void Output(String outputAddress){ FileWriter fw = null; 6 try { 7 fw = new FileWriter(outputAddress); 8 } catch (IOException e) { 9 // TODO Auto-generated catch block e.printStackTrace(); 10 } 11 BufferedWriter bw=new BufferedWriter(fw); 12 for(int i=0;i<sortedLineIndexes.length;i++){ 13 try { 14 bw.write(sortedLineIndexes[i]); bw.newLine(); 15 16 } catch (IOException e) { 17 // TODO Auto-generated catch block e.printStackTrace(); 18 } 19 } try { 20 bw.close(); 21 } catch (IOException e) { 22 // TODO Auto-generated catch block e.printStackTrace(); 23 } 24 } 25 public static void Input(String iFile){ FileReader fr=null; try { fr=new FileReader(iFile); 26 27 } catch (FileNotFoundException e) { e.printStackTrace(); 28 } 29 BufferedReader br=new BufferedReader(fr); textLines=new ArrayList<String>(); 30 try { while(br.ready()){ 31 textLines.add(br.readLine()); 32 } 33 } catch (IOException e) { e.printStackTrace(); 34 } 35 } 36 public static void CircularShift(){ shiftedLineIndexes=new ArrayList<String>(); for(int i=0;i<textLines.size();i++){ String orinLine=textLines.get(i); String sarray[]=orinLine.split(" "); for(int j=0;j<sarray.length;j++){ String newLine=sarray[j]; if(sarray.length>1){ 37 if(j==sarray.length-1){ 38 39 for(int k=0;k<(sarray.length-1);k++){ 40 newLine=newLine+" "+sarray[k]; 41 } 42 } 43 else{ 44 for(int k=j+1;k<sarray.length;k++){ 45 newLine=newLine+" "+sarray[k]; 46 } 47 48 for(int m=0;m<j;m++){ newLine=newLine+" "+sarray[m]; 49 } 50 } 51 } 52 shiftedLineIndexes.add(newLine); 53 } } }
KWIC 的面向對象程序體系結構風格示意圖以下所示:
基本的計算模型:
Input 模塊從文本文件 input.txt 中一行一行讀取單
Shift 模塊用於將單詞移位。 Sort 模塊將單詞進行排序。
Output 模塊將最終結果寫到文本文件 output.txt 中
KWIC 面向對象風格的 Java 語言實現:
1 //InputStore.java import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class InputStore { public ArrayList<String> ls; 2 public InputStore(ArrayList<String> ls){ this.ls=ls; 3 } 4 public void input(String inputFile){ FileReader fr=null; try { 5 fr=new FileReader(inputFile); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); 6 } 7 BufferedReader br=new BufferedReader(fr); try { while(br.ready()){ 8 ls.add(br.readLine()); 9 } 10 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); 11 } 12 } 13 } //Output.java import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; public class Output { public ArrayList<String> ls; 14 public Output(ArrayList<String> ls){ this.ls=ls; 15 } 16 public void output(String outputAddress){ 17 18 FileWriter fw = null; try { 19 fw = new FileWriter(outputAddress); 20 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); 21 } 22 BufferedWriter bw=new BufferedWriter(fw); 23 24 for(int i=0;i<ls.size();i++){ 25 26 try { 27 bw.write(ls.get(i)); bw.newLine(); 28 } catch (IOException e) { 29 // TODO Auto-generated catch block e.printStackTrace(); 30 } 31 } try { 32 bw.close(); 33 } catch (IOException e) { 34 // TODO Auto-generated catch block e.printStackTrace(); 35 } 36 } 37 38 } 39 40 //Alphabetizer.java import java.util.ArrayList; import java.util.Arrays; public class Alphabetizer { public ArrayList<String> ls; public Alphabetizer(ArrayList<String> ls){ this.ls=ls; 41 } 42 43 public void alpha(){ 44 45 String[] tmpArray = new String[ls.size()]; 46 ls.toArray(tmpArray); 47 Arrays.sort(tmpArray); for(int i=0;i<ls.size();i++){ ls.set(i, tmpArray[i]); 48 } 49 } 50 } 51 52 //CircularShifter.java import java.util.ArrayList; public class CircularShifter { public ArrayList<String> ls; public CircularShifter(ArrayList<String> ls){ this.ls=ls; 53 } 54 public void shift(){ 55 ArrayList<String> shiftedLineIndexes=new ArrayList<String>(); for(int i=0;i<ls.size();i++){ 56 String orinLine=ls.get(i); String sarray[]=orinLine.split(" "); for(int j=0;j<sarray.length;j++){ String newLine=sarray[j]; if(sarray.length>1){ if(j==sarray.length-1){ for(int k=0;k<(sarray.length-1);k++){ 57 newLine=newLine+" "+sarray[k]; 58 } 59 } 60 else{ 61 for(int k=j+1;k<sarray.length;k++){ 62 newLine=newLine+" "+sarray[k]; 63 } 64 65 for(int m=0;m<j;m++){ newLine=newLine+" "+sarray[m]; 66 } 67 } 68 } 69 shiftedLineIndexes.add(newLine); 70 } 71 } 72 ls=shiftedLineIndexes; 73 } 74 } 75 //Main.java import java.util.ArrayList; public class Main { 76 public static void main(String[] args) { 77 // TODO Auto-generated method stub 78 ArrayList<String>ls=new ArrayList<String>(); 79 80 InputStore inputStore=new InputStore(ls); 81 inputStore.input("input.txt"); 82 83 CircularShifter cs=new CircularShifter(ls); 84 cs.shift(); 85 86 Alphabetizer alp=new Alphabetizer(cs.ls); 87 alp.alpha(); 88 89 Output output=new Output(alp.ls); output.output("output.txt"); 90 } 91 } 92 93 94