130242014022-藍宏錚-第3次實驗
一、實驗目的
1.理解不同體系結構風格的具體內涵。
2.學習體系結構風格的具體實踐。
二、實驗環境
硬件: (依據具體情況填寫)
軟件:Java或任何一種自己熟悉的語言
三、實驗內容
“上下文關鍵字”KWIC(Key Word in Context,文本中的關鍵字)檢索系統接受有序的行集合:每一行是單詞的有序集合;每一個單詞又是字母的有序集合。通過重復地刪除航中第一個單詞,並把它插入行尾,每一行可以被“循環地移動”。KWIC檢索系統以字母表的順序輸出一個所有行循環移動的列表。
嘗試用不同的策略實現這個系統。選擇2-3種體系結構風格來實現。
四、實驗步驟:
要求寫具體實現代碼,並根據實際程序,畫出程序的總體體系結構圖和算法結構圖,以及運行結果截圖。
A.采用主/子程序的風格
1、體系結構圖:
2、簡述體系結構各部件的主要功能,實現思想。
例如:
上述的主程序/子程序的方法,將問題分解為輸入(Input)、移動(Shifter)、按字母表排序(Alphabetizer)、輸出(Output)。
Input: 將讀取到的每行的數據保存到實現LineStorage接口的數據結構中去
shifter:主函數調用該方法,該方法對characters中的每行的數據進行循環移位,並將移位得到的新行保存到實現LineStorage的數據結構中去
alphabetizer: 對circularShift中得到的行數據進行按字母順序排序
Output:output方法叠代調用alphabetizer裏面的方法得到按字母順序排好序的行數據,並輸出
Characters:實現字符的處理。讀取一行就用Characters抽象數據類型將該行存放,直到文件讀完為止
....
3、寫出主要的代碼
1 import java.io.BufferedReader; 2 import java.io.File; 3 import java.io.FileReader; 4 import java.util.ArrayList; 5 import java.util.Comparator; 6 import java.util.List; 7 8 public class KWIC { 9 public static void main(String[] args) { 10 11 //讀取文件 12 List<String[]> result = getContext(new File("fileTemp/lhz.txt")); 13 //循環移位 14 result = loopShift(result); 15 //排序 16 sort(result); 17 //輸出 18 printf(result); 19 } 20 21 private static List<String[]> getContext(File file) { 22 23 List<String[]> strList = new ArrayList<>(); 24 try { 25 BufferedReader reader = new BufferedReader(new FileReader(file)); 26 String line = null; 27 while ((line = reader.readLine()) != null) { 28 //以空格為分隔符 29 strList.add(line.split(" ")); 30 } 31 reader.close(); 32 } catch (Exception e) { 33 e.printStackTrace(); 34 } 35 return strList; 36 } 37 38 private static List<String[]> loopShift(List<String[]> strList) { 39 40 List<String[]> shiftStrList = new ArrayList<>(); 41 for (String[] strings : strList) { 42 for (int i = 0; i < strings.length; i++) { 43 StringBuilder builder = new StringBuilder(); 44 int j = i; 45 for (int times = 0; times < 3; times++) { 46 builder.append(strings[j]).append(","); 47 j++; 48 if (j == strings.length) { 49 j = 0; 50 } 51 } 52 shiftStrList.add(builder.toString().split(",")); 53 } 54 } 55 return shiftStrList; 56 } 57 58 private static void sort(List<String[]> shiftStrList) { 59 60 shiftStrList.sort(Comparator.comparing(o -> o[0])); 61 62 } 63 64 private static void printf(List<String[]> result) { 65 66 for (String[] strings : result) { 67 for (String string : strings) { 68 System.out.printf(string + " "); 69 } 70 System.out.println(); 71 } 72 } 73 }
4、顯示結果:
input:
output:
B:采用管道過濾器的風格
1、體系結構圖:
2、簡述體系結構各部件的主要功能,實現思想。
讀取文件:從本地讀取文件
循環移位:對讀取到的內容進行循環移位
排序:對移位後的結果進行排序
輸出:輸出到控制臺
3、寫出主要的代碼
1 import java.io.BufferedReader; 2 import java.io.File; 3 import java.io.FileReader; 4 import java.util.ArrayList; 5 import java.util.Comparator; 6 import java.util.List; 7 8 public class KWIC2 { 9 public static void main(String[] args) { 10 11 getContext(new File("fileTemp/lhz.txt")); 12 } 13 14 private static void getContext(File file) { 15 16 List<String[]> strList = new ArrayList<>(); 17 try { 18 BufferedReader reader = new BufferedReader(new FileReader(file)); 19 String line = null; 20 //循環讀取行 21 while ((line = reader.readLine()) != null) { 22 //以空格為分隔符 23 strList.add(line.split(" ")); 24 } 25 reader.close(); 26 } catch (Exception e) { 27 e.printStackTrace(); 28 } 29 //循環移位 30 loopShift(strList); 31 } 32 33 private static void loopShift(List<String[]> strList) { 34 35 List<String[]> shiftStrList = new ArrayList<>(); 36 for (String[] strings : strList) { 37 for (int i = 0; i < strings.length; i++) { 38 StringBuilder builder = new StringBuilder(); 39 int j = i; 40 for (int times = 0; times < 3; times++) { 41 builder.append(strings[j]).append(","); 42 j++; 43 if (j == strings.length) { 44 j = 0; 45 } 46 } 47 shiftStrList.add(builder.toString().split(",")); 48 } 49 } 50 //排序 51 sort(shiftStrList); 52 } 53 54 private static void sort(List<String[]> shiftStrList) { 55 56 shiftStrList.sort(Comparator.comparing(o -> o[0])); 57 //輸出 58 printf(shiftStrList); 59 } 60 61 private static void printf(List<String[]> result) { 62 63 for (String[] strings : result) { 64 for (String string : strings) { 65 System.out.printf(string + " "); 66 } 67 System.out.println(); 68 } 69 } 70 }
4、顯示結果:
input:
output:
五、實驗總結
調試程序中,遇到的問題,以及如何解決的。
130242014022-藍宏錚-第3次實驗