1、实验目的java
1.理解不一样体系结构风格的具体内涵。算法
2.学习体系结构风格的具体实践。学习
2、实验环境设计
硬件: 装好MyEclipse 2014及相关环境的window 7 笔记本一台3d
软件:Java或任何一种本身熟悉的语言blog
3、实验内容排序
“上下文关键字”KWIC(Key Word in Context,文本中的关键字)检索系统接受有序的行集合:每一行是单词的有序集合;每个单词又是字母的有序集合。经过重复地删除航中第一个单词,并把它插入行尾,每一行能够被“循环地移动”。KWIC检索系统以字母表的顺序输出一个全部行循环移动的列表。ip
尝试用不一样的策略实现这个系统。选择2-3种体系结构风格来实现。ci
4、实验步骤:字符串
要求写具体实现代码,并根据实际程序,画出程序的整体体系结构图和算法结构图,以及运行结果截图。
采用主/子程序的风格 和管道-过滤器风格
一、体系结构图:
二、简述体系结构各部件的主要功能,实现思想。
上述的主程序/子程序的方法,将问题分解为主控制、输入、循环移动、按字母表排序和输出几个模块。
输入: 获取待处理的字符串或多个字符串
循环移动:将字符串循环移动,获得移动的全部结果
按字母表排序:将全部的移动结果进行排序
输出:将最后结果输出
管道过滤器方法则是将问题分解为几个过滤器,分别处理字符串移动、排序、去重复,又分别将处理后的数据传给下一个过滤器
这里我用的是类来代替过滤器
三、写出主要的代码
排序的方法:
public List<String> doSort(List<String> stringList){ Collections.sort(stringList); return stringList; }
移动单词的方法
public List<String> moveString(List<String> stringList){ List<String> resultList = new ArrayList<String>(); //循环取出全部的String for (String string : stringList) { List<String> temList = getAllSortResult(string); for (String string2 : temList) { resultList.add(string2); } } return resultList; } /** * 获取全部排序结果的方法 * 将须要排序的句子传入 * 返回全部结果的List * @param str * @return */ public List<String> getAllSortResult(String str){ List<String> resultList = new ArrayList<String>(); String temString = str ; String currString = str; resultList.add(currString); while(true){ //若移动后的字符串 与传入的字符串相同,则跳出循环 currString = circulation(currString); if (temString.equals(currString)) break; else { resultList.add(currString); } } return resultList; } /** * 字符串循环后移 * 一次移动一个单词 * 将移动结果返回 * @param str * @return */ public String circulation (String str){ //检合 if (str == null || str.length() == 0) { throw new RuntimeException("the string is null。"); } //获取第一个非空字符到第一个空格 int firstSpace = str.indexOf(" "); String firstWord = str.substring(0, firstSpace); //取出的单词添加到字符串末尾 String resultString = str.substring(firstSpace+1)+" "+firstWord; //将结果返回 return resultString; }
四、显示结果:
5、实验总结
在写移动单词的方法的时候,一开始是在课上写的,把全部代码都写在一个方法里,并且在上课的时候思路还在,因此没有写注释
致使后面再次看这段代码的时候,彻底看不出来程序的用意和目的。
后来我从新理清思路,将一个方法分红两个小的方法,可是出现了另外一个问题:方法和方法之间的功能重叠度太大。过分的耦合使代码编写的过程,和外部调用的过程一团乱。
因而我按照实验要求的步骤,先画了我想设计的大体风格。先将功能划分开,而后再修改代码。终于让代码勉强比较容易“理解”。