一、实验目的
1.理解不同体系结构风格的具体内涵。
2.学习体系结构风格的具体实践。
二、实验环境
硬件: (依据具体情况填写)
软件:Java或任何一种自己熟悉的语言
三、实验内容
“上下文关键字”KWIC(Key Word in Context,文本中的关键字)检索系统接受有序的行集合:每一行是单词的有序集合;每一个单词又是字母的有序集合。通过重复地删除航中第一个单词,并把它插入行尾,每一行可以被“循环地移动”。KWIC检索系统以字母表的顺序输出一个所有行循环移动的列表。
尝试用不同的策略实现这个系统。选择2-3种体系结构风格来实现。
四、实验步骤:
要求写具体实现代码,并根据实际程序,画出程序的总体体系结构图和算法结构图,以及运行结果截图。
A.采用主/子程序的风格
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 KWIC { 9 public static void main(String[] args) { 10 11 //读取文件 12 List<String[]> result = getContext(new File("fileTemp/context.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、显示结果:
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/context.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、显示结果:
五、实验总结
调试程序中,遇到的问题,以及如何解决的。