软件体系结构的第3次实验(软件体系结构风格之应用)
一、实验目的
1.理解不同体系结构风格的具体内涵。
2.学习体系结构风格的具体实践。
二、实验环境
硬件: (依据具体情况填写)
软件:Java或任何一种自己熟悉的语言
三、实验内容
“上下文关键字”KWIC(Key Word in Context,文本中的关键字)检索系统接受有序的行集合:每一行是单词的有序集合;每一个单词又是字母的有序集合。通过重复地删除航中第一个单词,并把它插入行尾,每一行可以被“循环地移动”。KWIC检索系统以字母表的顺序输出一个所有行循环移动的列表。
四、实验步骤:
1、体系结构图:
2、简述体系结构各部件的主要功能,实现思想。
上述的主程序/子程序的方法,将问题分解为输入(Input)、移动(Shifter)、按字母表排序(Alphabetizer)、输出(Output)。
Input : 主函数调用该方法,读取数据,输出到控制台。
Shifter : 主函数调用该方法,实现移位。
Alphabetizer : 主函数调用该方法,对行数据进行按字母顺序排序
Output : 主函数调用该方法,输出到控制台
3、写出主要的代码
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.StringTokenizer;
/**
* @author wubangli
*
*/
public class SortKWIC {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
File input = new File("D:\\private","input.txt");
try {
input.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SortKWIC sortKWIC = new SortKWIC2();
sortKWIC.input("D:\\private\\input.txt");
sortKWIC.shifter();
sortKWIC.alphabetizer();
sortKWIC.output();
}
private ArrayList<String> kwicList = new ArrayList<String>();
private ArrayList<String> lineTxt = new ArrayList<String>();
private BufferedReader input;
// 读取文件
public void input(String fileName) {
File file = new File(fileName);
BufferedReader reader = null;
try {
System.out.println("-----------------Input------------------");
reader = new BufferedReader(new FileReader(file));
String tempString = null;
int line = 1;
// 一次读入一行,直到读入null为文件结束
while ((tempString = reader.readLine()) != null) {
// 显示行号
System.out.println(tempString);
line++;
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
try {
input = new BufferedReader(new FileReader(fileName));
} catch (Exception e) {
System.err.print("wrong");
System.exit(1);
}
String line;
try {
while ((line = input.readLine()) != null) {
lineTxt.add(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 移位
public void shifter() {
Iterator<String> it = lineTxt.iterator();
while (it.hasNext()) {
StringTokenizer strToken = new StringTokenizer(it.next());
ArrayList<String> strTokens = new ArrayList<String>();
int i = 0;
// 循环添加
int count = strToken.countTokens();
while (i < count) {
strTokens.add(strToken.nextToken());
i++;
}
// 分割+位移。
for (i = 0; i < count; i++) {
StringBuffer line = new StringBuffer();
int index = i;
for (int f = 0; f < count; f++) {
if (index >= count)
index = 0;
line.append(strTokens.get(index));
line.append(" ");
index++;
}
String word = line.toString();
kwicList.add(word);
}
}
}
// 排序
public void alphabetizer() {
Collections.sort(this.kwicList, new AlphabetizerComparator());
}
private class AlphabetizerComparator implements Comparator<String> {
@Override
public int compare(String a1, String a2) {
if (a1 == null && a2 == null) {
throw new NullPointerException();
}
int compareValue = 0;
char b1 = a1.charAt(0);
char b2 = a2.charAt(0);
compareValue = b1 - b2;
return compareValue;
}
}
// 输出数据
public void output() {
Iterator<String> it = kwicList.iterator();
System.out.println("-----------------Output-----------------");
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
4、显示结果: