一、实验目的
1.理解不同体系结构风格的具体内涵。
2.学习体系结构风格的具体实践。
二、实验环境
硬件: (依据具体情况填写)
软件:Java或任何一种自己熟悉的语言
三、实验内容
“上下文关键字”KWIC(Key Word in Context,文本中的关键字)检索系统接受有序的行集合:每一行是单词的有序集合;每一个单词又是字母的有序集合。通过重复地删除航中第一个单词,并把它插入行尾,每一行可以被“循环地移动”。KWIC检索系统以字母表的顺序输出一个所有行循环移动的列表。
尝试用不同的策略实现这个系统。选择2-3种体系结构风格来实现。
四、实验步骤:
要求写具体实现代码,并根据实际程序,画出程序的总体体系结构图和算法结构图,以及运行结果截图。
采用主/子程序的风格
1、体系结构图:
2、简述体系结构各部件的主要功能,实现思想。
上述的主程序/子程序的方法,将问题分解为输入(InPut)、读取行(getLine)、循环移动(Shifter)、排序(sort)、输出(outPut)。
InPut: 读取文件信息
getLine:读取每行信息
shifter:每行的数据进行循环移位
sort:得到的行数据进行按字母顺序排序
outPut:输出结果
3、写出主要的代码
package test; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; public class KWIC_1 { public static void main(String[] args) { List<String> result = new ArrayList<String>(); String line=""; //输入 BufferedReader inputFile = inPut("test.txt"); //读取行并循环移位 while (line!= null) { //读取行 line= getLine(inputFile); if (line !=null) { //循环移位 shifter(line, result); } } //排序 sort(result); //输出 outPut(result); } //输入,文件数据读取 public static BufferedReader inPut(String Filename) { BufferedReader inputFile = null; try { inputFile = new BufferedReader(new FileReader(Filename)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block System.err.println(("File error" + e.toString())); System.exit(1); } return inputFile; } //获取行信息 public static String getLine(BufferedReader inputFile) { String line =""; try { line = inputFile.readLine(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return line; } //循环移位 public static void shifter(String line,List<String> list) { StringTokenizer tokener = new StringTokenizer(line); String token = new String(); int index; ArrayList<String> tokens = new ArrayList<String>(); int count = tokener.countTokens(); for (int j = 0; j < count; j++) { token = tokener.nextToken(); tokens.add(token); } //对List中的字进行循环移位 for (int i = 0; i < count; i++) { index=i; StringBuffer linebuffer = new StringBuffer(); for (int j = 0; j < count; j++) { if (index >= count) index = 0; linebuffer.append(tokens.get(index)); linebuffer.append(" "); index++; } line = linebuffer.toString(); list.add(line); } } //排序 public static void sort(List<String> list) { //对List中的字进行排序 for (int i = 0; i < list.size()-1; i++) { for (int j = 0; j < list.size()-i-1; j++) { if (list.get(j).compareToIgnoreCase(list.get(j+1)) > 0){ String string = list.get(j+1); list.set(j+1,list.get(j)); list.set(j,string); } } } } //输出 public static void outPut(List<String> List) { System.out.println("-------------------------"); for (int count = 0; count < List.size(); count++) { System.out.println (List.get(count)); } } }
4、显示结果:
管道过滤器风格
1、体系结构图:
2、简述体系结构各部件的主要功能,实现思想。
上述的管道过滤器风格,分为五个过滤器:
InPut: 读取文件信息
getLine:读取每行信息
shifter:每行的数据进行循环移位
sort:得到的行数据进行按字母顺序排序
outPut:输出结果
3、主要的代码
package test; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; public class KWIC_4 { public static void main(String[] args) { inPut("test.txt"); } //输入,文件数据读取 public static void inPut(String Filename) { BufferedReader inputFile = null; List<String> result = new ArrayList<String>(); String line=""; try { inputFile = new BufferedReader(new FileReader(Filename)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block System.err.println(("File error" + e.toString())); System.exit(1); } //读取行并循环移位 while (line!= null) { //读取行 line= getLine(inputFile); if (line !=null) { //循环移位 shifter(line, result); } } } //获取行信息 public static String getLine(BufferedReader inputFile) { String line =""; try { line = inputFile.readLine(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return line; } //循环移位 public static void shifter(String line,List<String> list) { StringTokenizer tokener = new StringTokenizer(line); String token = new String(); int index; ArrayList<String> tokens = new ArrayList<String>(); int count = tokener.countTokens(); for (int j = 0; j < count; j++) { token = tokener.nextToken(); tokens.add(token); } //对List中的字进行循环移位 for (int i = 0; i < count; i++) { index=i; StringBuffer linebuffer = new StringBuffer(); for (int j = 0; j < count; j++) { if (index >= count) index = 0; linebuffer.append(tokens.get(index)); linebuffer.append(" "); index++; } line = linebuffer.toString(); list.add(line); } //排序 sort(list); } //排序 public static void sort(List<String> list) { //对List中的字进行排序 for (int i = 0; i < list.size()-1; i++) { for (int j = 0; j < list.size()-i-1; j++) { if (list.get(j).compareToIgnoreCase(list.get(j+1)) > 0){ String string = list.get(j+1); list.set(j+1,list.get(j)); list.set(j,string); } } } //输出 outPut(list); } //输出 public static void outPut(List<String> List) { System.out.println("-------------------------"); for (int count = 0; count < List.size(); count++) { System.out.println (List.get(count)); } } }
4、显示结果:
五、实验总结
调试程序中,遇到的问题,以及如何解决的。
作业博客要求:
标题:是学号+姓名+第3次实验