一、实验目的
1.理解不同体系结构风格的具体内涵。
2.学习体系结构风格的具体实践。
二、实验环境
硬件: (依据具体情况填写)
软件:Java或任何一种自己熟悉的语言
三、实验内容
“上下文关键字”KWIC(Key Word in Context,文本中的关键字)检索系统接受有序的行集合:每一行是单词的有序集合;每一个单词又是字母的有序集合。通过重复地删除航中第一个单词,并把它插入行尾,每一行可以被“循环地移动”。KWIC检索系统以字母表的顺序输出一个所有行循环移动的列表。
尝试用不同的策略实现这个系统。选择2-3种体系结构风格来实现。
四、实验步骤:
1、管道-过滤器风格
1.1体系结构图
1.2简述体系结构各部件的主要功能,实现思想。
上述的管道-过滤器方法,有5种过滤器:输入(input)、空格处理(trim)、循环移动(moving)、排序(sort)、输出(output)。
input: 将控制台输入的每行的数据保存到数据结构中去。
trim: 去掉首尾的空格,以及处理连续出现的空格。
moving: 对集合进行循环移位,并将移位得到的新行保存到原先集合中去。
sort: 利用Collections提供的sort()方法直接对集合进行排序。
output: 把集合按顺序输出,显示在控制台上。
1.3主要代码。
public class Kwic { /* *控制台手动输入 */ public static ArrayList<String> input() { System.out.println("-----------------"); System.out.println("请输入:"); ArrayList<String> list = new ArrayList<String>();
Scanner in = new Scanner(System.in); while (true) { String text = in.nextLine(); if ("".equals(text)) { break; } list.add(text); } in.close(); return list; } /*** * 空格处理 */ public static ArrayList<String> trim(ArrayList<String> list) { for (int i = 0; i < list.size(); i++) { String s = list.get(i); s = s.trim(); for (int j = 0; j < s.length() - 1; j++) { if (s.substring(j, j + 2).equals(" ")) { s = s.substring(0, j + 1) + s.substring(j + 2); j--; } } list.set(i, s); } return list; } /** * 循环移动,并添加到集合 */ public static ArrayList<String> moving(ArrayList<String> list) { int count = list.size(); for (int i = 0; i < count; i++) { String s = list.get(i); String[] arr = s.split(" "); for (int h = 1; h < arr.length; h++) { s = arr[h]; for (int j = (h + 1) % arr.length; j != h; j++, j %= arr.length) { s += " " + arr[j]; } list.add(s); } } return list; } /** *排序 */ public static ArrayList<String> sort(ArrayList<String> list) { Collections.sort(list); return list; } /** *输出 */ public static void output(ArrayList<String> list) { System.out.println("------------------------"); System.out.println("输出为:");
for (String s : list) { System.out.println(s); } } public static void main(String[] args) { output(sort(moving(trim(input())))); } }1.4显示结果
2.采用主/子程序的风格
1.1、体系结构图
1.2、简述体系结构各部件的主要功能,实现思想
读文件:从本地读取测试的文本文件
循环移位:对读取到的内容进行循环移位
排序:对移位后的结果进行排序
输出显示:将结果输出到控制台进行显示
1.3主要代码
public
class
Main {
public
static
void
main(String[] args) {
List<String[]> result = getContext(
new
File(
"D:\\Desktop\\a.txt"
));
result = loopShift(result);
sort(result);
print(result);
}
private
static
void
print(List<String[]> result) {
for
(String[] strings : result) {
for
(String string : strings) {
System.out.printf(string +
" "
);
}
System.out.println();
}
}
private
static
void
sort(List<String[]> shiftStrList) {
shiftStrList.sort(Comparator.comparing(o -> o[
0
]));
}
private
static
List<String[]> loopShift(List<String[]> strList) {
List<String[]> shiftStrList =
new
ArrayList<>();
for
(String[] strings : strList) {
for
(
int
i =
0
; i < strings.length; i++) {
StringBuilder builder =
new
StringBuilder();
int
j = i;
for
(
int
times =
0
; times <
3
; times++) {
builder.append(strings[j]).append(
","
);
j++;
if
(j == strings.length) {
j =
0
;
}
}
shiftStrList.add(builder.toString().split(
","
));
}
}
return
shiftStrList;
}
private
static
List<String[]> getContext(File file) {
List<String[]> strList =
new
ArrayList<>();
try
{
BufferedReader reader =
new
BufferedReader(
new
FileReader(file));
String line =
null
;
while
((line = reader.readLine()) !=
null
) {
strList.add(line.split(
" "
));
}
reader.close();
}
catch
(Exception e) {
e.printStackTrace();
}
return
strList;
}
}
1.4结果