1. 程式人生 > >130242014022-藍宏錚-第3次實驗

130242014022-藍宏錚-第3次實驗

字母表 分享 檢索 關鍵字 數據類型 結果 let 試用 ()

一、實驗目的

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次實驗